Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用for循环为多个按钮创建事件处理程序?_C#_Winforms_Button - Fatal编程技术网

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

C# 如何使用for循环为多个按钮创建事件处理程序?,c#,winforms,button,C#,Winforms,Button,我想将50个按钮的点击事件设置为-private void buttonOnOff(对象发送者,EventArgs e) 当我像这样编写代码时,它会起作用: public Form1() { InitializeComponent(); button1.Click += button_Click; button2.Click += button_Click; button3.Click += button_Clic

我想将50个按钮的点击事件设置为-private void buttonOnOff(对象发送者,EventArgs e)

当我像这样编写代码时,它会起作用:

    public Form1()
    {
        InitializeComponent();

        button1.Click += button_Click;
        button2.Click += button_Click;
        button3.Click += button_Click;
       .......
    }
foreach (Button b in this.Controls.OfType<Button>())
{
    // here, you could check the name, if necessary
    // and add your handler
    b.Click += buttonOnOff;
}
foreach (Button b in this.Controls.OfType<Button>())
{
    if (b.Tag.ToString() == "SomeIndicator")
    {
        b.Click += buttonOnOff;
    }
}
SomePanel.Controls[buttonName].Click += buttonOnOff;
但是是否可以使用for循环来实现这一点呢。当我尝试时,会出现以下错误:对象引用未设置为对象的实例

错误在这一行代码上:控件[buttonName]。单击+=ButtonOff

以下是我当前使用的代码:

    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;
        }
    }
public Form1()
{
初始化组件();
字符串按钮名;
for(int i=1;i<51;i++)//检查每个按钮。
{
buttonName=“button”+i;
控件[buttonName]。单击+=按钮关闭;
}
}

您可以迭代表单控件(甚至是使用Linq的特定按钮)-类似以下内容:

    public Form1()
    {
        InitializeComponent();

        button1.Click += button_Click;
        button2.Click += button_Click;
        button3.Click += button_Click;
       .......
    }
foreach (Button b in this.Controls.OfType<Button>())
{
    // here, you could check the name, if necessary
    // and add your handler
    b.Click += buttonOnOff;
}
foreach (Button b in this.Controls.OfType<Button>())
{
    if (b.Tag.ToString() == "SomeIndicator")
    {
        b.Click += buttonOnOff;
    }
}
SomePanel.Controls[buttonName].Click += buttonOnOff;
好的,在@Servy的请求中取消删除此项:


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

因此,在你的1-50组中,要么缺少一个按钮,要么命名为else

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


然而,正如我已经建议的:调试循环!检查崩溃的按钮名称/实例,检查
控件的内容(您必须深入查看私有成员)等

首先声明一个控件数组变量并将您的按钮添加到其中

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);
}
按钮btn;
对于(int-index=0;index<50;index++)
{
btn=(按钮)B_列表[索引];
点击+=新建事件处理程序(按钮关闭);
}

如果您在ctor中执行此操作,为什么不通过设计器添加它们?事实上,如果你得到一个NRE,这是一个不同的问题(和一个dupe),你想把相同的处理程序添加到表单上的每个按钮(
foreach(Controls.OfType()中的var button){…}
),还是只添加到一些按钮的子集?我只想添加50个按钮,而不是所有按钮。我已经在设计器中创建了按钮。现在我想要它,这样当你点击任何一个按钮时,它就会运行这个方法。只要在循环中用
I替换
I,你就可以从控件列表中按名称获得按钮控件。您的异常“对象引用未设置为对象的实例”仅表示列表中没有具有此名称的对象。因此,在你的1-50集合中要么缺少一个按钮,要么命名为else。只需继续获取此错误-对象引用未设置为类似于此答案的objectI实例。您甚至可以使用控件的“Tag”属性,这些控件需要作为连接到这个事件处理程序的目标。如果合适,也不要忘记删除事件处理程序。Robri1989,请确保您正在迭代一个实际包含目标控件的集合,并确保它与目标控件的“按钮”类型相同。要扩展@mars red所说的内容:在不首先删除以前分配的处理程序的情况下,不允许此代码执行多次。如果失败,则每次单击都将生成对处理程序的>1个调用。此外,如果没有正确删除这些处理程序,可能会导致内存问题。我的循环没有问题。即使我只是循环使用3个按钮,也不起作用。我肯定有3个按钮-按钮1,按钮2,按钮3。如果我改变了,点击事件如下-button1.click+=button\u click;我没有错误。但一旦我提到控件,比如在-Controls[buttonName]中;它将按钮读取为空!这是为什么?您确定窗体是按钮的父级吗?如果它们位于某种容器控件中,它们将不在窗体的控件集合中。所以,假设它们在一个GroupBox中,你需要做一些GroupBoxName.Controls[buttonName]……这并不是问题的答案。这是对评论的回应。您应该删除此内容,并将想法转移到适当的位置。@DonBoitnott它怎么不回答这个问题?这是一个什么样的评论?@DonBoitnott我同意,他问了如何在循环中进行,但他也问了为什么会出现错误。我想这在某种程度上回答了这个问题,但只是提供了异常的定义。这个问题看起来更像是“我如何修复它”,而这并不是试图解决问题。我的循环没有任何问题。即使我只是循环使用3个按钮,也不起作用。我肯定有3个按钮-按钮1,按钮2,按钮3。如果我改变了,点击事件如下-button1.click+=button\u click;我没有错误。但一旦我提到控件,比如在-Controls[buttonName]中;它将按钮读取为空!为什么会这样?