C# 委托(delegate)未被删除

标签 c# delegation

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

相关文章:

kotlin - 在 Kotlin 中通过委托(delegate)访问委托(delegate)接收者

ios - 我可以直接在场景的 sprite kit 节点中响应触摸,还是需要通过场景的 touchesBegan 方法

c# - 写入特定字节 C#

c# - 如何确定哪些函数和 sql 过程导致主机服务器上的 cpu 使用率过高

c# - 如何将 DbSet<T> 转换为 List<T>

c# - C# 中的 JSON 字符串到 CSV 和 CSV 到 JSON 的转换

iphone - 如何从选定的 UITableViewCell 获取自定义 NSManagedObject 子类

ruby-on-rails - 将记录委托(delegate)与 Mongoid Rails 和 Ruby 结合使用

Perl OO 使用 Moose - 编写委托(delegate)示例的最佳方式?

c# - 命名空间中不存在 wpf 资源字典?