Как привязать функцию к событию Click каждого элемента управления в массиве элементов управления в С#

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

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

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, который содержит индекс нажатой кнопки; но у меня не получилось из-за отсутствия достаточных знаний С#.

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


person Hossein    schedule 22.06.2011    source источник


Ответы (2)


int index = i;    
buttons[index].Click += (sender, e) => myClick(index);

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

person Bas    schedule 22.06.2011
comment
В цикле for мне пришлось написать var index=i; buttons[i].Click += (sender, e) => myClick(index); См. stackoverflow.com/q/6439477 - person Hossein; 22.06.2011

person    schedule
comment
Это требует, чтобы кнопки были полем и линейным поиском в массиве кнопок. - person Bas; 22.06.2011
comment
Я знаю об этом и проголосовал за ваш ответ, потому что они мне нравятся. Но вообще я бы не пропустил EventArgs в обработчике. Может быть в дальнейшем развитии, требуется взаимодействие с ними. - person DanielB; 22.06.2011