如何使用控件数组获取C#中给定对象的数组索引?

时间:2009-06-09 17:46:55

标签: c# .net controls event-handling control-array

我正在为表单动态添加一堆控件。每个控件都调用相同的方法,在该方法中,我需要知道执行该操作的控件的数组索引。

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”当然,如果有更简单的方法来处理动态控件,我会很感激指针。

4 个答案:

答案 0 :(得分:5)

private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = Array.IndexOf(myCB, (CheckBox)sender).ToString();
}

答案 1 :(得分:3)

Control应该有Tag属性。也许你可以将索引附加到Tag。你会招致拳击......

答案 2 :(得分:3)

int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
 // here you can use "j"

};

答案 3 :(得分:2)

一个明显的解决方案是设置标签:

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)。