我正在winForm中编写一个应用程序.我在from1中有一个面板,它有许多事件处理程序.当我处理panel1并创建新面板时,之前的事件存在并且它们会触发.为了删除panel1事件,我尝试了下面的代码.
panel1.Click -= clickHandle_1 ;
Run Code Online (Sandbox Code Playgroud)
但它并不适用于程序代码中的每一个地方.例如,在另一种方法中.当我创建新的panel1时,如何删除panel1的所有先前事件?
根据此,取消所有的单击事件 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]);
Run Code Online (Sandbox Code Playgroud)
并且要取消panel1的其他事件,请更改EventClick为要删除的事件名称.
可以使用以下代码获取所有事件名称:
EventInfo[] info = type.GetEvents();
for (int i = 0; i < info.Length; i++)
{
Console.WriteLine(info[i].Name + "\n");
}
Run Code Online (Sandbox Code Playgroud)