如何使用for循环为多个按钮创建事件处理程序?
我想设置50个按钮的点击事件为 - private void buttonOnOff(object sender,EventArgs e)。
它可以在我写这样的代码时工作:
public Form1()
{
InitializeComponent();
button1.Click += button_Click;
button2.Click += button_Click;
button3.Click += button_Click;
.......
}
但是有可能使用for循环来做到这一点。 当我尝试我得到以下错误:对象引用未设置为对象的实例。
错误出现在这行代码中:Controls [buttonName] .Click + = buttonOnOff;
这是我目前使用的代码:
public Form1()
{
InitializeComponent();
string buttonName;
for (int i = 1; i < 51; i++) // Does a check for each button.
{
buttonName = "button" + i;
Controls[buttonName].Click += buttonOnOff;
}
}
你可以遍历表单控件(甚至是使用Linq的特定按钮) - 如下所示:
foreach (Button b in this.Controls.OfType<Button>())
{
// here, you could check the name, if necessary
// and add your handler
b.Click += buttonOnOff;
}
提出一些很好的评论来增加答案:
正如@ mars-red和@donboitnott所指出的,不要让这段代码执行多次。 在你当前的例子中,你是在Form的构造函数中做的,所以这很好。
另外,@ mars-red提到了你的按钮的Tag属性。 如果你的表单上有其他按钮,并且不想试图弄清楚哪些按钮,你可以为每个标签添加一个特定的值,并检查它 - 所以,像这样:
foreach (Button b in this.Controls.OfType<Button>())
{
if (b.Tag.ToString() == "SomeIndicator")
{
b.Click += buttonOnOff;
}
}
当然,你也可以在按钮名称中寻找特定的模式。
如果您使用此代码,则您的“对象引用”问题没有意义。 迭代器为您提供了特定的按钮实例,因此“b”应始终是循环中的按钮。
最终更新:
主要问题是表单不是按钮控件的“容器”(它们在面板中)。 因此,用户应该使用Panel的控件(如下所示),而不是使用Form的控件:
SomePanel.Controls[buttonName].Click += buttonOnOff;
首先声明一个控件数组变量并将它添加到它的按钮。
Control[] B_list = new Control[] { Button1, Button2, Button3, ...... }
然后在for循环中,像这样串行使用
Button btn;
for(int index = 0; index < 50; index++)
{
btn = (Button)B_list[index];
btn.Click += new EventHandler(buttonOnOff);
}
好的,在@Servy的请求中取消删除:
在循环中,您将通过控件列表中的名称获取按钮控件。 您的例外“对象引用未设置为对象的实例”仅仅意味着列表中没有包含此名称的对象。
因此,您的1-50组中有一个按钮缺失或命名为其他按钮。
如果您使用@ snow_FFFFFF的解决方案,并且错误仍然存在,那真是奇怪。
不过,正如我已经建议的:调试循环! 检查哪个按钮名称/实例崩溃,检查Controls
的内容(您必须稍微向私人成员下载)等
上一篇: How to create an event handler for multiple buttons using a for loop?