Ваш первый метод должен работать, но последний не должен работать.потому что когда вы используете метод PicBx[z].Click -= delegate { clicked(z2, null); };
, вы не удаляете старый делегат, вместо этого вы создаете новый делегат, а затем удаляете его.
При первой попытке это должно работать:
private void SomeMethod()
{
var myClickDelegate = (EventHandler)delegate { clicked(z2, null); };
PicBx[z].Click += myClickDelegat;
//Do extra work
PicBx[z].Click -= mayClickDelegat;
}
Редактировать: Сопряжение с вашим комментарием: я заметил, что вы только в своем делегате добавляете clicked(z2, null)
, поэтому я предположил, что вы создаете делегата на первом месте только для передачи этого int z2
представлять индекс графического блока.Вы можете поместить этот индекс с самим графическим блоком, используя pictureBox.Tag
и в событии click получить int
из тега:
int z2 = z;
picBx[z].Tag = z2;//here we embedded the number with the picture box.
PicBx[z].Click += clicked;
...
PicBx[z].Click -= clicked;
И так в событии clicked:
private void clicked(object sender, EventArgs e)
{
PictureBox pictureBox = sender as PictureBox;
if (pictureBox != null)
{
int number = Convert.ToInt32(pictureBox.Tag);
...
}
}
Edit2: В паре с вашими комментариями кажется, что у вас другая подпись метода clicked
:
private void clicked(int tes,..
{
Pnl[tes].BackColor = Color.Red;
}
Здесь мы только изменим его на:
private void clicked(object sender, EventArgs e)
{
PictureBox pictureBox = sender as PictureBox;//when user clicks on picture box it will be the sender parameter.
if (pictureBox != null)
{
//we add number to each of picture boxes at there tags. "picBx[z].Tag = z2"
int tes = Convert.ToInt32(pictureBox.Tag);
pnl[tes].BackColor = Color.Red;
}
}