我怎样才能获得在C#中使用控件数组给定对象的数组索引?
-
13-09-2019 - |
题
我动态添加一堆控件的形式。每个控制调用相同的方法,在这方法我需要知道的是执行操作的控制的数组索引。
CheckBox[] myCB = new CheckBox[100];
int i;
for (i = 0; i < 100; i++)
{
myCB[i] = new CheckBox();
myCB[i].Text = "Clicky!";
myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
tableLayoutPanel1.Controls.Add(myCB[i]);
}
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
label1.Text = sender.???array index property???.ToString();
}
所以,如果我点击myCB[42]
label1
将显示为“42”,当然,如果有处理动态控制我会很感激的指针。一个简单的方法
解决方案
一个明显的解决方案是设置标记:
CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
myCB[i] = new CheckBox();
myCB[i].Text = "Clicky!";
myCB[i].Click += new System.EventHandler(dynamicbutton_Click);
myCB[i].Tag = i;
tableLayoutPanel1.Controls.Add(myCB[i]);
}
然后:
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
Control control = (Control) sender;
label1.Text = sender.Tag.ToString();
}
另一种方法是捕捉在事件处理程序的信息,最简单地使用lambda表达式或匿名方法:
CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
int index = i; // This is very important, as otherwise i will
// be captured for all of them
myCB[i] = new CheckBox();
myCB[i].Text = "Clicky!";
myCB[i].Click += (s, e) => label1.Text = index.ToString();
tableLayoutPanel1.Controls.Add(myCB[i]);
}
或更复杂的行为:
CheckBox[] myCB = new CheckBox[100];
for (int i = 0; i < myCB.Length; i++)
{
int index= i; // This is very important, as otherwise i will
// be captured for all of them
myCB[i] = new CheckBox();
myCB[i].Text = "Clicky!";
myCB[i].Click += (s, e) => DoSomethingComplicated(index, s, e);
tableLayoutPanel1.Controls.Add(myCB[i]);
}
(其中,声明DoSomethingComplicated
适当)。
其他提示
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
label1.Text = Array.IndexOf(myCB, (CheckBox)sender).ToString();
}
控制的应具有一个Tag属性。也许你可以将索引标签。你会招致虽然拳击...
int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
// here you can use "j"
};
不隶属于 StackOverflow