【问题标题】:How to remove all Event handler from a Control in C#.net如何从 C#.net 中的控件中删除所有事件处理程序
【发布时间】:2012-10-03 17:46:01
【问题描述】:

我在表单加载期间使用了一些递归函数。我以编程方式在控件上附加事件处理程序。由于递归函数,事件处理程序会多次与控件挂钩。我想从这些控件中删除所有处理程序。

例如。我在文本框中添加了 keypress、keydown、gotfocus 等事件。我想删除所有这些处理程序。如何实现?

【问题讨论】:

  • 它只删除了点击事件。我想从控件中删除所有事件。我该怎么做?
  • 听起来多个处理程序不是有意的......首先不要添加多个处理程序不是更好吗?
  • 我想加一次,不多。即 keypress, keydown, gotfocus 所有这些一次。但由于某些函数调用,这些函数会被多次添加。
  • 本文stackoverflow.com/questions/91778/… 中的方法 private void RemoveClickEvent(Button b) 完成了这项工作,但它只删除了点击事件。

标签: c# .net events


【解决方案1】:

如果loEventHandler 是您之前订阅的事件处理程序(例如单击),则可以通过执行loBox.Click -= loEventHandler; 将其删除。

也可以通过将事件设置为 null MyEvent = null; 来清除私有范围内的事件,但这不适用于公共范围。

【讨论】:

  • 我希望删除所有事件。如果我添加更多的处理程序,超过 5,6,它可能会很混乱。所以我想一次全部删除。
【解决方案2】:

您不能从“外部”世界执行此操作,因为事件是一种特殊类型的委托,不允许订阅者相互干扰。

【讨论】:

  • 本文stackoverflow.com/questions/91778/… 中的方法 private void RemoveClickEvent(Button b) 完成了这项工作,但它只删除了点击事件。
  • @NitinKabra:嗯,这是完成工作的一种老套方法;)
  • 啊。哈克反射。我想它有效,只需将您要使用的事件替换为Click
【解决方案3】:

为了避免一个事件被多次注册,你可以像这样添加一个属性包装器

    public event EventHandler<EventArgs> _event;
    public event EventHandler<EventArgs> PublicEvent
    {

        add
        {
            if (_event == null)
                _event += value;
        }

        remove
        {
            _event -= value;
        }
    }

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2023-03-13
    • 2012-09-04
    相关资源
    最近更新 更多