日期:2014-05-17  浏览次数:20925 次

c# 删除控件事件
在网上找到

 void ClearEvent(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(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事件的所有挂接事件。

    测试了一下是好用的.但是我想删除DataGridView控件的CellContentClick事件.怎样传值才能让fieldInfo不等于null.类似源码那样写 ClearEvent(dgvDes,'CellContentClick')是不好用的.

------解决方案--------------------
"Event" + eventname是什么,CellContentClick中那里有Event字样
------解决方案--------------------
你的是什么情况,非要用这种方法取消事件;
-=不能满足需求嚒;
你这个代码,我以前用过,就是'CellContentClick'没写对,有时候里面的名字不一定就是事件的全拼;
你可以试一下其写法;比如‘OnCellContentClick’ 主要里面那个委托你看不到,谁晓得当初人家写的啥。。
------解决方案--------------------
        private void ClearEvent(Control control, string eventname)
        {
            if (control == null) return;
            if (string.IsNullOrEmpty(eventname)) return;
            BindingFlags mPropertyFlags = BindingFlags.Public 
------解决方案--------------------
 BindingFlags.NonPublic 
------解决方案--------------------
 BindingFlags.Instance 
------解决方案--------------------