我正在winForm中编写一个应用程序。我在from1中有一个面板,它有许多事件处理程序。 当我处理panel1并创建新面板时,之前的事件存在并且他们开火为了删除panel1事件,我尝试了下面的代码。
panel1.Click -= clickHandle_1 ;
但它并不适用于程序代码中的每一个地方。例如,在另一种方法中。 当我创建新的panel1时,如何删除panel1的所有先前事件?
答案 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();
}
}