2015-12-12 57 views
1

如何高效地檢測到Listbox的哪個元素被選中並切換到相應的表單?目前,我這樣做:作爲表格選擇器的列表框

public static Form GetForm(string name) 
{ 
    switch (name)  //name - Selected item in listbox as string 
    { 
     case "Преломление Света": 
      return new Light(); 
     case "Закон Ома": 
      return new OHMsLaw(); 
     default: 
      return null; 
    } 
} 

它工作正常,但我懷疑我的解決方案是好的。

+0

什麼是你的單元測試說的功能?它會產生你期望的結果嗎?如果是,爲什麼你認爲你的代碼有問題。如果不是 - 你應該問不同的問題。如果您對[重構切換案例]有疑問(http://stackoverflow.com/questions/20822683/refactoring-switch-cases) - 請隨時關閉重複。 –

回答

1

我將存儲在字典中的形式,如:

ConcurrentDictionary<string, Form> _forms; 

void InitDictionaries(){ 
    _forms = new ConcurrentDictionary<string, Form>(); 
    _forms.TryAdd("Преломление Света", new Light()>; 
    _forms.TryAdd("Закон Ома", new OHMsLaw()>; 
    //... 
} 

所以,當涉及到的選擇,我可以使用:

public Form GetForm(string name) 
{ 
    Form toShow; 
    _forms.TryGetValue(name, out toShow); 
    return show; 
} 

這個字典存儲形式實例。


另一種方法是存儲派生形式,但如果你想保存現有的,它不是一個很好的解決方案,因爲它創造了新的實例。

ConcurrentDictionary<string, Type> _forms; 

你會這種方式添加類型:

_forms.TryAdd("Закон Ома", typeof(OHMsLaw)); 

你會用這種方式:

public Form GetForm(string name) 
{ 
    Type type; 
    _forms.TryGetValue(name, out type); 
    if (type != null) 
     return Activator.CreateInstance(type) as Form; 

    return null; 
} 
+0

不知道這是如何與「重構開關」現有的答案有所不同,如http://stackoverflow.com/questions/20822683/refactoring-switch-cases ...也不清楚,如果重構開關語句是OP正在嘗試的問題在這裏解決。 –

+1

第二種解決方案非常完美!另外,它可能不能'返回Activator.CreateInstance(type);'它應該是這樣的:'返回Activator.CreateInstance(type)作爲Form;' –

+0

你是對的,我忘了添加投射,因爲我直接在這裏寫信來源。我正在糾正它,謝謝你指出。 – KAI