C#中删除控件的事件的方法类

方法一:

/// <summary>
         /// 删除指定控件的指定事件
         /// </summary>
         /// <param name="control"></param>
         /// <param name="eventname"></param>
         public void ClearEvent(System.Windows.Forms.Control control, string eventname)
         {
             if (control == null) return;
             if (string.IsNullOrEmpty(eventname)) return;
 
            BindingFlags mPropertyFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic;
             BindingFlags mFieldFlags = BindingFlags.Static | BindingFlags.NonPublic;
             Type controlType = typeof(System.Windows.Forms.Control);
             PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
             EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
             FieldInfo fieldInfo = (typeof(System.Windows.Forms.Control)).GetField("Event" + eventname, mFieldFlags);
             Delegate d = eventHandlerList[fieldInfo.GetValue(control)];
 
            if (d == null) return;
             EventInfo eventInfo = controlType.GetEvent(eventname);
 
            foreach (Delegate dx in d.GetInvocationList())
                 eventInfo.RemoveEventHandler(control, dx);
 
        }
 
调用:ClearEvent(button1,"Click");//就会清除button1对象的Click事件的所有挂接事件。

方法二:
写一个操作类,记录添加的事件列表,删除时从事件列表中读取出来然后删除.
class MyEventManager:IDisposable
     {
         EventHandlerList eventList = new EventHandlerList();
         Hashtable eventObjectList = new Hashtable();
         public void AddEvent(Control control, string eventname, EventHandler eventhandler)
         {
             string keystr = control.Name + eventname;
             if (!eventObjectList.Contains(keystr)) eventObjectList.Add(keystr, new object());
             object eventObject = eventObjectList[keystr];
             switch (eventname)
             {
                 case "Click":
                     control.Click += eventhandler;
                     break;
                 case "Enter":
                     control.Enter += eventhandler;
                     break;
                     //...
                     //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举
                     //当然用反射也可以,不过用反射就没必要用这种方法了。
             }
             eventList.AddHandler(eventObject, eventhandler);
         }
         public void DelEvent(Control control, string eventname)
         {
             string keystr = control.Name + eventname;
             object eventObject = eventObjectList[keystr];
             Delegate d = eventList[eventObject];
             if (d == null) return;
             foreach (Delegate dd in d.GetInvocationList())
             {
                 switch (eventname)
                 {
                     case "Click":
                         control.Click -= (EventHandler)dd;
                         break;
                     case "Enter":
                         control.Enter -= (EventHandler)dd;
                         break;
                     //...
                     //这里可以添加更多的事件支持,这都是因为C# 不支持宏替换而采用的无奈之举
                     //当然用反射也可以,不过用反射就没必要用这种方法了。
                 }
 
            }
 
            eventList.RemoveHandler(eventObject, d);
             eventObjectList.Remove(eventObject);
         }
 }



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值