如何使用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的内容(您必须稍微向私人成员下载)等

链接地址: http://www.djcxy.com/p/35707.html

上一篇: How to create an event handler for multiple buttons using a for loop?

下一篇: Windows form AximageEdit control event initialization