我想将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;
}
}
答案 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;}
}
的内容(你必须稍微降低私人成员)等等