Как я могу получить индекс массива данного объекта в C# с массивами управления?
Я динамически добавляю кучу элементов управления в форму. Каждый элемент управления вызывает один и тот же метод, и в этом методе мне нужно знать индекс массива элемента управления, выполнившего действие.
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 ответа
Одним из очевидных решений было бы установить тег:
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();
}
Другой альтернативой является сбор информации в обработчике событий, наиболее просто используя лямбда-выражение или анонимный метод:
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();
}
int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
// here you can use "j"
};
Элементы управления должны иметь свойство Tag. Может быть, вы можете прикрепить индекс к тегу. Вы будете нести бокс, хотя...