删除特定Control的所有EventHandler

Ami*_*aei 3 c# winforms

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

panel1.Click -=  clickHandle_1 ; 
Run Code Online (Sandbox Code Playgroud)

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

Ami*_*aei 9

根据,取消所有的单击事件 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)

  • 你应该把原始答案的来源 - /sf/answers/6429741/ (2认同)