1

又是我,尽量不这么快打扰你们,但我有一个问题……ssss…………

好的,所以,当我创建具有多个按钮的应用程序时,我通常通过为每个按钮分配相同的事件处理程序来处理它们的单击事件。我给他们唯一的名字或标签,然后通过 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,女巫让我在退出几次后就失去了它......

那么,有人有其他建议或解决方案,或者可能有一些指南吗?我是个不要脸的人,我什么都接受!(开个玩笑……我不接受美国运通)

4

3 回答 3

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();
于 2013-08-04T13:12:28.517 回答
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 的属性中存储一个 ActionTag并调用它。(虽然,正如评论中提到的,这是不可扩展的。你可以添加一个 List 但这会变得很乱,我不推荐它)。

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

于 2013-08-04T13:12:42.533 回答
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;
        }
于 2015-04-03T08:47:30.393 回答