c# - 删除使用 lambda 表达式添加的 eventHandler

标签 c# lambda eventhandler

我有一个添加了事件的控件。但是,我需要将一些额外的参数传递给事件方法,所以我使用 lambda 表达式,就像这里描述的那样:

Pass parameter to EventHandler

comboBox.DropDown += (sender, e) => populateComboBox(sender, e, dataSource, selectedItem);

但是这个事件应该只在应该移除的条件之后第一次满足条件时触发。

这样做是行不通的:

comboBox.DropDown -= (sender, e) => populateComboBox(sender, e, dataSource, selectedItem);

那么问题来了,有没有办法去掉这个方法呢?

我看过这个:

How to remove all event handlers from a control

但我无法让它为 ComboBox DropDown 事件工作。

最佳答案

它没有被删除的问题是因为您在删除它时给出了一个新的 lambda 表达式。您需要保留 Lambda 表达式创建的委托(delegate)的引用以将其从控件中删除。

EventHandler handler = (x, y) => comboBox1_DropDown(x, y);
comboBox1.DropDown += handler;

它将像这样简单地工作:

comboBox1.DropDown -= handler;

通过反射:

    private void RemoveEvent(ComboBox b, EventHandler handler)
    {
        EventInfo f1 = typeof(ComboBox).GetEvent("DropDown");
        f1.RemoveEventHandler(b, handler);
    }

关于c# - 删除使用 lambda 表达式添加的 eventHandler,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36021743/

相关文章:

java - Java 流阶段是顺序的吗?

c# - 如何使 EqualityComparer 与两个字段进行比较?

jQuery:如何检测所有输入上的模糊事件

java - ACTION_UP 不起作用,但 ACTION_DOWN 工作正常

c# - 检查方法是否已注册到事件

c# - 管理 Application Insights Cookie

c# - 尝试使用 root 以外的用户访问 MySQL 数据库时,ASP.NET Web 应用程序抛出异常

c# - 检查实体是否实现接口(interface)并在通用存储库中添加谓词

C# EF 从一个表中查找数据的最佳方法

Java8流顺序和并行执行产生不同的结果?