Как привязать функцию к событию Click каждого элемента управления в массиве элементов управления в C # - PullRequest
1 голос
/ 22 июня 2011

Когда вы создаете массив элементов управления в C #, как вы можете привязать функцию, которая получает индекс нажатой кнопки, к их событию click?

Вот некоторый код, предназначенный исключительно для лучшего понимания. Где-то в верхней части кода вы определяете кнопки:

Button [] buttons = new Button[100];

Стандартное событие Click для них выглядит так:

private void myClick(object sender, EventArgs e)
{

}

И обычно вы связываете это так:

for (int i = 0; i < 100; i++)
    buttons[i].Click += myClick;

Но я хочу, чтобы обработчик событий был в такой форме:

private void myClick(int Index)
{

}

Как связать события щелчка с вышеуказанной функцией с / без временных функций?

Я думал об использовании делегатов, Func<T, TResult> нотации или как-то передать пользовательские EventArgs, которые содержат индекс нажатой кнопки; но я не добился успеха из-за недостатка знаний C #.

Если кто-то из вас собирается предложить сохранить индекс каждого элемента управления в его теге: Да, это было возможно, но я не хочу использовать его по какой-то причине, поскольку, если у вас есть класс, который генерирует некоторые события, но не у него нет свойства Tag или чего-то подобного, этот способ бесполезен.

Ответы [ 2 ]

6 голосов
/ 22 июня 2011
int index = i;    
buttons[index].Click += (sender, e) => myClick(index);

Как указано в комментарии ниже, использование 'i' будет использовать одну и ту же переменную для всех элементов управления из-за ее объема.Поэтому необходимо создать новую переменную в той же области, что и лямбда-выражение.

2 голосов
/ 22 июня 2011
private void myClick(object sender, EventArgs e)
{
    int index = buttons.IndexOf(sender as Button);
}
...