首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 剔除控件事件

2013-02-28 
c# 删除控件事件在网上找到 void ClearEvent(Control control, string eventname){if (control null) r

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 
------解决方案--------------------


 BindingFlags.IgnoreCase 
[解决办法]
BindingFlags.Static;
            BindingFlags mFieldFlags = BindingFlags.Static 
[解决办法]
 BindingFlags.NonPublic;
            Type controlType = control.GetType();
            PropertyInfo propertyInfo = controlType.GetProperty("Events", mPropertyFlags);
            EventHandlerList eventHandlerList = (EventHandlerList)propertyInfo.GetValue(control, null);
            String name  = "Event" + eventname;
            FieldInfo fieldInfo = controlType.GetField(name, mFieldFlags);
            if (fieldInfo == null)
            {
                name = "Event_" + controlType.Name + eventname;
                fieldInfo = controlType.GetField(name, mFieldFlags);
                if (fieldInfo == null)
                {
                    name = name.ToUpper();
                    fieldInfo = controlType.GetField(name, 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);

        }

热点排行