2013-03-18 197 views
2

我正在开发项目在widows c#.net中。在形式上,我有超过8个组合框控件。 当combobox1选择如下改变时,我会加载数据到combobox2。将方法作为参数传递给另一个方法

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    comboBox2.DataSource = DataTable; 
    comboBox2.DisplayMember="Name"; 
    comboBox2.ValueMember = "ID"; 
} 

Combobox3将被加载,当我选择combobox2像下面。

private void comboBox2_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    comboBox3.DataSource = DataTable; 
    comboBox3.DisplayMember = "Age"; 
    comboBox3.ValueMember = "AgeCode"; 
} 

就像我会加载数据到其余的组合框。
这里的问题是错误会发生,如果我没有检查comboBox1_SelectedIndexChanged方法是否加载或不加载comboBox2。

我知道我们可以通过使用布尔变量来检查,但可怕的是我们需要保持其“真/假”状态来休息所有方法。

所以我想到在简单的方法来解决这个问题的是,我将使用Add(combobox, Methodname)方法和Remove(combobox, method)方法来添加和删除组合框SelectedIndexChanged事件comboBox_SelectedIndexChanged功能。

但我无法通过该方法作为参数。任何人都可以告诉我如何将方法作为参数传递给我的需求。

+0

看看'Func'和'Action' – 2013-03-18 11:12:23

+0

检查这个答案http://stackoverflow.com/a/2082650/182344 – RredCat 2013-03-18 11:13:25

+0

你可以传递委托作为参数。但我认为这不会解决您的问题。 – 2013-03-18 11:13:47

回答

3

通过method参数AddRemove米ethod如果你的意思是comboBox1_SelectedIndexChanged和/或comboBox2_SelectedIndexChanged然后解决方案是

private void Add(ListControl dropDownList, EventHandler handlerMethodName) 
{ 
    dropDownList.OnSelectedIndexChanged += handlerMethodName; 
    //some logic here 
} 

private void Remove(ListControl dropDownList, EventHandler handlerMethodName) 
{ 
    dropDownList.OnSelectedIndexChanged -= handlerMethodName; 
    //some logic here 
} 

请注意:这是DropDownListASP.NETComboBoxWinForms应用。

欲了解更多请参考:MSDN - DropDownListMSDN - ListControl.SelectedIndexChanged Event

+0

给予+1帮助我....感谢很多大声笑... – jeevacl 2013-03-18 13:16:37

+0

@jeevacl请接受有用的答案.. :) – 2013-03-18 13:21:27

+0

@jeevacl我已经在亚历山大和他给出了同样的答案,因为我已经回答.. :(这是不公平的游戏.. – 2013-03-19 06:27:14

1

我不确定你想要做什么。但为什么不是一个ComboBox和方法的字典?

这样的:

var dict = Dictionary<ComboBox, Action<object, EventArgs>>(); 

private void Add(ComboBox c, Action<object, EventArgs>e) { 
    dict[c] = e; 
} 

private void Remove(ComboBox c, Action<object, EventArgs> e) { 
    dict.Remove(c); 
} 

,并呼吁::

private void CallHandler(ComboBox c, EventArgs e) 
{ 
    dict[c](c, e); 
} 

或者

private void AddHandler(ComboBox c, Action<object, EventArgs> e) 
{ 
    c.SelectedIndexChanged += e; 
} 

private void RemoveHandler(ComboBox c, Action<object, EventArgs> e) 
{ 
    c.SelectedIndexChanged -= e; 
} 
+0

谢谢大声笑....有相当难懂的字典..无论如何替代是有益的,并得到了解决方案...再次感谢 – jeevacl 2013-03-18 13:15:47

1

我也不能100%肯定那种你正在寻找解决方案,但我对你的需求的理解有以下几种方法:

public void Add(DropDownList combo, EventHandler method) 
{ 
    combo.SelectedIndexChanged += method; 
} 

public void Remove(DropDownList combo, EventHandler method) 
{ 
    combo.SelectedIndexChanged -= method; 
} 

现在你可以定义自己的方法应该具有相同签名EventHandler委托:

public void MyMethod1(object sender, EventArgs e) 
{} 

,你可以注册并通过调用上述定义的方法注销你的方法:

DropDownList lst = new DropDownList(); 
Add(lst, MyMethod1); 
Remove(lst, MyMethod1); 

但要注意,这可能是不是你的问题的最佳解决方案。

+0

谢谢大声笑....这是我的问题的解决方案....非常感谢 – jeevacl 2013-03-18 13:12:27