读书人

c# 剔除控件事件

发布时间: 2013-02-28 11:33:09 作者: rapoo

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);

}

读书人网 >C#

热点推荐