2012-08-02 74 views
0

是否可以調用基於文本值的方法?是否可以在C#中調用基於combobox.selecteditem.tostring()的方法?

如果可能,我不想使用'if'或'switch'語句。

如果是這樣,我需要看看做什麼?

這只是嘗試和清理接口。

例如用if語句:

if (cmb_Motor.SelectedItem.ToString() == "OutPortA") 
      NXT_Brick.OutPortA.SetOutputState(); 
    else if (cmb_Motor.SelectedItem.ToString() == "OutPortB") 
      NXT_Brick.OutPortB.SetOutputState(); 
    else if (cmb_Motor.SelectedItem.ToString() == "OutPortC") 
      NXT_Brick.OutPortC.SetOutputState(); 

我想 'NXT_Brick' 後更改 'OutPortA,B,C'。

回答

2

ifswitch statments可以在字典來hidded,例如:

private IDictionary<string, OutPort> ports = new Dictionary<string, OutPort>{ 
    {"OutPortA", NXT_Brick.OutPortA}, 
    {"OutPortB", NXT_Brick.OutPortB}, 
    {"OutPortC", NXT_Brick.OutPortC} 
} 

用法:

if(ports.Contains(key)) 
{ 
ports[key].SetOutputState(); 
} 
+0

謝謝,我的確在尋找與反思開始的事情,但我可能一直在朝着錯誤的方向前進。 – Crypic2009 2012-08-02 22:49:16

0

委託是指向函數/方法的指針,因此您可能需要使用它。例如,使用委託簽名(參數及其類型)創建指向數組的指針的數組,並通過索引數組來調用該方法。舉個例子:

public delegate void SelectState(); 

public class Test 
{ 
    SelectState[] stateMethods = new SelectState[] 
    { 
     new SelectState(SelectA), 
     new SelectState(SelectC), 
     new SelectState(SelectB), 
     new SelectState(SelectB) 
    }; 

    void SelectA() { /* ... */ } 
    void SelectB() { /* ... */ } 
    void SelectC() { /* ... */ } 

    void DoSomething() 
    { 
     int index = cmb_Motor.SelectedIndex; 
     // Get the method pointer. 
     var method = stateMethods[index]; 
     // Call the method, one of the State*() methods. 
     method(); 
    } 
} 

或者,如果你不想使用索引,但一個字符串,如你的榜樣,你可能想使用字典:

Dictionary<string, SelectState> stateMethods = new Dictionary<string, SelectState> 
{ 
    {"OutPortA", new SelectState(SelectA)}, 
    {"OutPortB", new SelectState(SelectB)}, 
    {"OutPortC", new SelectState(SelectC)}, 
}; 
4

最乾淨的方式,我可以認爲將是爲您的組合框項類是這樣的:

class Item 
{ 
    public string Name{get;set;} 
    public Action Action{get;set;} 

    public override string ToString() { return Name; } 
} 

然後添加這個類的實例,以您的組合框:

cmbItems.Add(new Item{Name="Item1", Action=()=>{ /*action 1*/ }); 
cmbItems.Add(new Item{Name="Item2", Action=()=>{ /*action 2*/ }); 
cmbItems.Add(new Item{Name="Item3", Action=()=>{ /*action 3*/ }); 

而在你選擇的項目更改事件(或您的OK按鈕按下,不論),你投你的SelectedItem財產Item,然後調用其Action屬性來運行代碼。

((Item)cmbItems.SelectedItem).Action(); 
+0

HAH!英雄所見略同。 :) +1。 – 2012-08-02 20:36:26

0

一個好的解決方案(一般來講 - 它可能不是在你的特殊情況下,最好的方法,但判斷,我們需要更多的信息)似乎像存儲對象我ComboBox而不是單純的字符串。這些對象應該提供ComboBox中可見的文本以及運行要調用的方法的方法。

在您的例子,它看起來像你總是調用一個OutPort實例的SetOutputState方法(假設這裏的類名),所以你的ComboBox項的對象看起來是這樣的:

public class ComboItem 
{ 
    public ComboItem(string displayName, OutPort outPort) 
    { 
     this.displayName = displayName; 
     this.outPort = outPort; 
    } 

    private readonly string displayName; 

    private readonly OutPort outPort; 

    public override string ToString() 
    { 
     return displayName; 
    } 

    public OutPort OutPort { 
     get { 
      return outPort; 
     } 
    } 
} 

注意ToString方法的結果將是ComboBox中用戶可見的字符串。

你將不得不填補像這樣的組合框:如果你需要在你想要做什麼更多的變化

ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem; 
if (selectedItem != null) { 
    selectedItem.OutPort.SetOutputState(); 
} 

cmb_Motor.Items.Add(new ComboItem("OutPortA", NXT_Brick.OutPortA); 
cmb_Motor.Items.Add(new ComboItem("OutPortB", NXT_Brick.OutPortB); 
cmb_Motor.Items.Add(new ComboItem("OutPortC", NXT_Brick.OutPortC); 

然後,您可以評估這樣選擇的項目所選項目,將動作也執行到ComboItem類中:

public class ComboItem 
{ 
    public ComboItem(string displayName, OutPort outPort) 
    { 
     this.displayName = displayName; 
     this.outPort = outPort; 
    } 

    private readonly string displayName; 

    private readonly OutPort outPort; 

    protected OutPort OutPort { 
     get { 
      return outPort; 
     } 
    } 

    public override string ToString() 
    { 
     return displayName; 
    } 

    public virtual void DoWork() 
    { 
     outPort.SetOutputState(); 
    } 
} 

OutPort財產現在不再需要公開;您只需在選定的項目上撥打DoWork即可。因此,評估代碼可以改成這樣:

ComboItem selectedItem = cmb_Motor.SelectedItem as ComboItem; 
if (selectedItem != null) { 
    selectedItem.DoWork(); 
} 

對於任何需要一個不同的動作,你現在可以得到從ComboItem一個新類,覆蓋DoWork方法做不同的事情。

1

組合框包含列表項。根據MSDN,您可以將ANYING存儲在組合框中,不過通常用於存儲文本字符串。所以選擇正確解決問題的最簡單的解決方案。

public class FiringComboItem 
{ 
    public string Text { get; set; } 
    public Action OnClick { get; set; } 
    override public ToString() { return Text; } 
} 

添加項目到組合是這樣的:

myCombo.Add (new FiringComboItem 
    { 
     Text = "About", 
     OnClick =() => new AboutDialog.ShowDialog() 
    }); 

在您的下拉處理程序:

private void myCombo_OnSelectedIndexChanged(object sender, EventArgs e) 
{ 
    (myCombo.SelectedItem As FiringComboItem).OnClick(); 
}