如何使用for循环为多个按钮创建事件处理程序?

时间:2017-11-02 19:04:03

标签: c# winforms button

我想将50个按钮的点击事件设置为 - private void buttonOnOff(object sender,EventArgs e)。

当我像这样编写代码时,它可以工作:

    public Form1()
    {
        InitializeComponent();

        button1.Click += button_Click;
        button2.Click += button_Click;
        button3.Click += button_Click;
       .......
    }

但是可以使用for循环来做到这一点。当我尝试时,我收到以下错误:对象引用未设置为对象的实例。

错误出现在以下代码行中:控件[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;
        }
    }

3 个答案:

答案 0 :(得分:4)

你可以遍历表单控件(甚至是使用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”应始终是循环中的按钮。

最终更新:

主要问题是表单不是按钮控件的“容器”(它们在面板中)。因此,用户不应该使用Form的控件,而应该使用Panel的控件(如下所示):

SomePanel.Controls[buttonName].Click += buttonOnOff;

答案 1 :(得分:0)

首先声明一个控制数组变量并将按钮添加到它。

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);
}

答案 2 :(得分:-1)

好的,在@Servy:

的请求中取消删除

在循环中,您将从控件列表中按名称获取按钮控件。您的异常“对象引用未设置为对象的实例”仅表示列表中没有具有此名称的对象。

所以要么在你的1-50集中有一个按钮缺失或命名为else。

如果您正在使用@ snow_FFFFFF的解决方案并且错误仍然存​​在,那真的很奇怪。

然而,正如我已经建议的那样:调试循环!检查它崩溃的按钮名称/实例,检查public Class Obj { public string @currencyId {get; set;} public string __value__ {get; set;} } 的内容(你必须稍微降低私人成员)等等