Как я могу получить индекс массива данного объекта в C # с массивами управления? - PullRequest
1 голос
/ 09 июня 2009

Я динамически добавляю несколько элементов управления в форму. Каждый элемент управления вызывает один и тот же метод, и в этом методе мне нужно знать индекс массива элемента управления, выполнившего действие.

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 ]

5 голосов
/ 09 июня 2009
private void dynamicbutton_Click(Object sender, System.EventArgs e)
{
    label1.Text = Array.IndexOf(myCB, (CheckBox)sender).ToString();
}
3 голосов
/ 09 июня 2009
int j = i;
myCB[i].Click += delegate(object sender, EventArgs e) {
 // here you can use "j"

};
3 голосов
/ 09 июня 2009

Элементы управления должны иметь свойство Tag. Может быть, вы можете прикрепить индекс к тегу. Вы будете нести бокс, хотя ...

2 голосов
/ 09 июня 2009

Одним из очевидных решений было бы установить тег:

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 соответственно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...