这又是我,试着不要这么快打扰你们,但我有一个问题...... 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,这使得我在几次退出后失去它...
那么,任何人都有其他建议或解决方案,或者某些指南?我是一个无耻的人,我会接受任何事情! (只是开玩笑......我不接受美国运通)
答案 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;
}