Проблема в том, что вы создаете замыкание по переменной цикла i
. Вам нужно сделать локальную (внутри цикла for
) копию перед передачей в обработчик событий.
for (int i = 0; i < 100; i++)
{
var index = i; // YOU NEED TO DO THIS
buttons[i] = new Button();
buttons[i].SetBounds(i % 10 * 50, i / 10 * 50, 50, 50);
buttons[i].Click += (sender, e) => myClick(index); // THIS SOLVES THE PROBLEM
this.Controls.Add(buttons[i]);
}
Объяснение
Вы определяете функцию следующим образом:
(sender, e) => myClick(i)
Эта функция (которая будет запущена в какой-то момент в будущем при нажатии кнопки) включает ссылку на i
. Способ работает так, что он будет использовать значение i
в тот момент, когда происходит щелчок , а не в то время, когда функция определена.
К тому времени, очевидно, значение i
станет 100.
Решение работает, потому что оно заставляет функцию принимать ссылку на переменную index
вместо i
. index
отличается от i
тем, что i
- это одна переменная, значение которой изменяется, тогда как index
- это имя, которое мы используем для 100 различных переменных (по одной для каждой итерации цикла), , значение которого остается постоянным .