2013-08-04 118 views
0

这又是我,试着不要这么快就烦你们这些家伙,但我有一个问题... SSSS ... ... ...C#如何处理多个按钮点击事件?

好了,所以,当我创建的应用程序有多个按钮,我通常通过为每个按钮分配相同的事件处理程序来处理它们的点击事件。我给他们他们独特的名字或标签,然后用switch-case循环,使用他们的名字或标签给他们分配他们的工作,职责,使命,无效,你知道......所以,在我的代码中看起来像这样:

private void button_Click(object sender, EventArgs e) 
    { 
     Button B = (Button)sender; 
     switch (B.Name) 
     { 
      case "START": optionStart(); break; 
      case "LOAD": optionLoad(); break; 
      case "EXIT1": Application.Exit(); break; 
      case "EXIT2": backToMainMenu(); break; 
     } 
    } 

我这里面临几个问题: 1.使用我的“技术”这整个事情是相当混乱,当你达到约20-30按钮。 2.相同名称的按钮必须处理不同,所以我给他们命名通常EXIT1,EXIT2,EXIT3女巫让我失去它后几个更多的退出...

所以,任何人有一个替代的建议或解决方案或可能一些指​​南?我是一个无耻的人,我会接受任何东西! (只是开玩笑......我不接受美国运通卡)

+3

而是每个Button.Click事件挂钩到相同的事件处理程序 - 创建一个事件处理程序*每个*按钮。如果你的按钮名称很好,那就是,它们是自我记录的 - 你的代码将变得更具可读性。 –

+0

这是一个很好的建议...我会尝试一下:) –

回答

2

如何使用字典。注册您希望运行的方法,然后注册到您的处理程序中 - 只需查看并使用它即可。

一个例子(为了简化处理无差错) -

初始化由:由

private void button_Click(object sender, EventArgs e) 
    { 
     m_clickHandler[sender as Button].Invoke(); 
    } 

另一种方式

m_clickHandler = new Dictionary<Button, Action>(); 
m_clickHandler.add(startButton, optionStart); 

句柄是使用Lambda表达式。您可以将事件直接与您希望运行的事件挂钩。这将为您节省通常得到的丑陋参数处理程序。

button1.Click += (a,b) => Foo(); 
+1

我一直没有使用它,只是因为我没有意识到它,谢谢你的信息,我仍然在阅读一个编程书,我还没有达到那个部分: ) –

+0

编码是学习如何编码的最好也是唯一的方法:)顺便说一下,您应该选择最适合您需要的答案(keyboardP或我的 - 并接受它)。 – Vadim

+0

我意识到这一点,只是我认为这有点太早,也许我会有更多的选择,谁知道,如果在一两天内什么都没有出现,我会选择,不要担心我不要忘记在这里;) –

1

您仍然必须键入操作,但这可能会使您更容易维护。

Dictionary<string, Action> actionDict = new Dictionary<string, Action>(); 
          { 
          { "START", optionStart}, 
          { "LOAD", optionLoad}, 
          { "EXIT1",() => { Application.Exit(); }}, 
          { "EXIT2", backToMainMenu } 
          }; 

private void button_Click(object sender, EventArgs e) 
{ 
    Button B = (Button)sender; 
    if(B != null) 
    { 
     Action methodToCall = null; 
     if (actionDict.TryGetValue(B.Name, out methodToCall)) 
     { 
      methodToCall(); 
     } 
    } 
} 

然后,您可以轻松地添加或从字典中删除,而无需修改switch语句。

或者,您可以在按钮的Tag属性中存储操作并调用该操作。 (虽然,正如评论中提到的,这是不可扩展的,你可以添加一个List,但这会变得混乱,我不会推荐它)。

但是,总的来说,为什么你有这么多的退出选项?您似乎可以重新设计屏幕流,以更好地适应多种退出方式。

+0

集合初始化器在这里会相当不错:-) –

+0

我想过使用标签,但我认为它有一个严重的可扩展性问题。如果他想处理更多事件会发生什么? – Vadim

+0

是的,标签选项对于一般用途来说并不是最理想的。 – keyboardP

1

我有一个解决方法,你..你可以设置

int Type1 = 1; 
int Type2 = 2; 
button1.tag = Type1; 
button2.tag = Type2; 
button3.tag = Type1; 

事件

Button B = (Button)sender; 
     switch ((int)B.Tag) 
     { 
      case 1: optionStart(); break; 
      case 2: optionLoad(); break; 
      case 3: Application.Exit(); break; 
      case 4: backToMainMenu(); break; 
     } 
相关问题