С#, как отобразить или передать значение, на что вы нажали

У меня есть код, который создает панели с картинками в них. Я хотел бы, чтобы что-то сказало мне, на какое поле изображения было нажато. Я использую следующее:

PicBx[z].Click += new EventHandler(clicked);

Нужно ли присваивать значение клику? Или есть способ просто отобразить то, на что вы нажали?


person user770344    schedule 26.07.2011    source источник
comment
У вашего EventHandler есть параметр object sender?   -  person Alex R.    schedule 26.07.2011


Ответы (3)


Метод-обработчик получает элемент управления, который был нажат, в качестве параметра sender.
Вы можете привести его к PictureBox и делать с ним все, что хотите.

Кроме того, вы можете добавить в качестве обработчика анонимный метод:

PicBx[z].Click += delegate { SomeMethod(z, somethingElse); };

Однако убедитесь, что не закрывать переменную цикла.

person SLaks    schedule 26.07.2011
comment
Я использую цикл foreach, поэтому, если я использую делегат, он сделает z любым последним введенным значением. Есть ли способ сделать его уникальным для каждого созданного Picturebox? - person user770344; 26.07.2011
comment
Да; вам нужно объявить отдельную переменную внутри цикла. blogs.msdn.com/b/ericlippert/archive/2009/11/12/ - person SLaks; 26.07.2011
comment
Понятно! Поместите int z2=z; в цикл и используйте PicBx[z].Click += delegate { clicked(z2, null); }; Работает как шарм! - person user770344; 26.07.2011

В метод clicked передается аргумент (отправитель объекта). Это PictureBox, который был нажат.

person Michael Stum    schedule 26.07.2011
comment
Но проблема в том, что существует несколько изображений, созданных с помощью цикла foreach. Отправитель объекта будет иметь только последнее созданное значение изображения. Мне нужно иметь возможность щелкнуть любое окно изображения, которое было создано, и вернуть уникальное значение для этого окна изображения. - person user770344; 26.07.2011
comment
@user: sender не из замыкания; он всегда будет содержать фактический PictureBox, вызвавший событие. - person SLaks; 26.07.2011

Ваш обработчик событий будет иметь в своей подписи два аргумента: object sender и EventArgs e. sender — это объект, на который вы нажали, поэтому вы можете преобразовать его в PictureBox или любой другой тип, которым он на самом деле является, и все должно быть хорошо.

person FishBasketGordo    schedule 26.07.2011