删除特定Control的所有EventHandler

时间:2013-09-12 20:33:10

标签: c# winforms

我正在winForm中编写一个应用程序。我在from1中有一个面板,它有许多事件处理程序。 当我处理panel1并创建新面板时,之前的事件存在并且他们开火为了删除panel1事件,我尝试了下面的代码。

panel1.Click -=  clickHandle_1 ; 

但它并不适用于程序代码中的每一个地方。例如,在另一种方法中。 当我创建新的panel1时,如何删除panel1的所有先前事件?

4 个答案:

答案 0 :(得分:9)

根据this, 要取消panel1的所有点击事件,请执行以下操作:

FieldInfo f1 = typeof(Control).GetField("EventClick", BindingFlags.Static| BindingFlags.NonPublic);
object obj = f1.GetValue(panel1);
PropertyInfo pi = panel1.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
EventHandlerList list = (EventHandlerList)pi.GetValue(panel1, null);
list.RemoveHandler(obj, list[obj]);

要取消panel1的其他事件,请将EventClick更改为您要删除的事件名称。

可以使用此代码获取所有事件名称:

EventInfo[] info = type.GetEvents();
for (int i = 0; i < info.Length; i++)
{
   Console.WriteLine(info[i].Name + "\n");
}

答案 1 :(得分:3)

一次删除一个:

panel1.Click -= clickHandle_1;

没有干净的方法可以立即取消订阅所有事件处理程序。跟踪您订阅的内容并相应地取消订阅。

答案 2 :(得分:1)

通常当您Dispose某个对象/控件时,该对象/控件的所有成员(包括Event handler list)也应该被置于不可用。所以当你说your panel1 is disposed时,就不可能在那个被控制的控件上发起任何事件(例如Resize)。 您应该检查是否确实丢弃了面板。您可以使用以下方法使用Event handlers Reflection Dispose Events的类型删除控件的所有EventHandlerList

public void RemoveHandlerList(Control c){
  EventHandlerList list = (EventHandlerList) typeof(Control).GetProperty("Events", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(c, null);
  typeof(EventHandlerList).GetMethod("Dispose").Invoke(list, null);
}

答案 3 :(得分:0)

不确定这是否有效,但这是我最接近的:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }


    private Dictionary<string, EventHandler> _handlers = new Dictionary<string, EventHandler>();
    TextBox _txt = new TextBox();

    void WireHandlers()
    {

         // get references of your handlers
         EventHandler _hnd1 = delegate { return; }; // here will be your named method. This is only for example
         EventHandler _hnd2 = delegate { return; }; // here will be your named method. This is only for example

         // wire handlers
        _txt.Click += _hnd1;
        _txt.TextChanged  += _hnd2;
         // save wired handler collection
        _handlers.Add("Click", _hnd1);
        _handlers.Add("TextChanged", _hnd2);
    }


    void UnwireHandlers()
    {

        // lets unwire all handlers
        foreach (var kvp in _handlers)
        {
            // inspect keyValuePair - each key corresponds to the name of some event
            switch (kvp.Key)
            {
                case "Click":
                    _txt.Click -= kvp.Value;
                    break;
                case "TextChanged":
                    _txt.TextChanged  -= kvp.Value;
                    break;
                default:
                    throw new Exception("no such handler found");
            }
        }

        _handlers.Clear();
    }

}