gpt4 book ai didi

C# 委托(delegate)未被删除

转载 作者:太空宇宙 更新时间:2023-11-03 11:33:32 26 4
gpt4 key购买 nike

在程序中,我创建了多个带有图片框的面板。图片框被委托(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com