C#如何处理多个按钮点击事件?

时间:2013-08-04 13:04:27

标签: c# events button click

这又是我,试着不要这么快打扰你们,但我有一个问题...... ssss ...... ......

好的,所以,当我使用多个按钮创建应用程序时,我通常通过为每个按钮分配相同的事件处理程序来处理它们的click事件。我给他们他们独特的名字或标签,然后用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 个答案:

答案 0 :(得分:2)

如何使用词典。注册你想要运行的方法然后在你的处理程序中 - 只需查找并使用它。

一个例子(为简单起见,没有错误处理) -

初始化:

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

处理

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

另一种方法是使用Lambda表达式。您可以将事件直接挂接到您希望运行的内容。这将为您节省处理程序通常获得的丑陋参数。

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

答案 1 :(得分: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语句。

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

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

答案 2 :(得分: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;
        }