在程序中,我创建了多个带有图片框的面板。图片框被委托(delegate)为可点击。我想让用户可以选择从订单中删除其中一个面板/图片框。现在,如果它被移除并且顺序被重新排列,则在被移除的图片框保留其委托(delegate)顺序之后所有图片框。所以在被删除的那个之后点击其中任何一个,跳到它旁边的那个(即点击#9,它将转到#10)。我需要删除重新排序的委派并正确地重新委派它们。我试过:
int z2 = z;
var myClickDelegate = (EventHandler)delegate { clicked(z2, null); };
PicBx[z].Click += myClickDelegate;
创造和
PicBx[z].Click -= myClickDelegate;
删除
还有
int z2 = z;
PicBx[z].Click -= delegate { clicked(z2, null); };
但他们都没有删除原始委托(delegate)。
最佳答案
您的第一种方法应该有效,但后一种方法应该无效。
因为当你执行 PicBx[z].Click -= delegate { clicked(z2, null); };
方法你没有删除旧的委托(delegate),而是创建一个新的委托(delegate)然后删除它。
在您的第一次尝试中,这应该可行:
private void SomeMethod()
{
var myClickDelegate = (EventHandler)delegate { clicked(z2, null); };
PicBx[z].Click += myClickDelegat;
//Do extra work
PicBx[z].Click -= mayClickDelegat;
}
编辑: 与您的评论配对:
我注意到您只是在您的委托(delegate)中添加 clicked(z2, null)
,所以我假设您只是在第一时间创建委托(delegate)只是为了传递该 int z2
代表图片框索引。
您可以使用 pictureBox.Tag
将该索引与图片框本身放在一起,并在点击事件中从标签中获取 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;
所以在点击事件中:
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;
}
}
关于C# 委托(delegate)未被删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7004816/