c# 删除控件事件

我是沒头脑 2013-02-26 04:18:10
在网上找到

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')是不好用的.
...全文
542 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
我是沒头脑 2013-02-27
  • 打赏
  • 举报
回复
引用 10 楼 lye2000000_super 的回复:
private void ClearEvent(Control control, string eventname) { if (control == null) return; if (string.IsNullOrEmpty(eventname)) return; ……
不知道是不是所有的都可以删除,但是DataGridView的CellContentClick是好用的.谢谢.
  • 打赏
  • 举报
回复
引用 13 楼 WANGL_9527 的回复:
引用 12 楼 davinciyxw 的回复:5楼的问题还没回答呢,为什么不用-=用过了,不好用
你如果针对特定的控件。不会不好用吧。。。。。。。
我是沒头脑 2013-02-27
  • 打赏
  • 举报
回复
引用 12 楼 davinciyxw 的回复:
5楼的问题还没回答呢,为什么不用-=
用过了,不好用
  • 打赏
  • 举报
回复
5楼的问题还没回答呢,为什么不用-=
  • 打赏
  • 举报
回复
不一定能删除所有的。。。。
  • 打赏
  • 举报
回复
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); }
  • 打赏
  • 举报
回复
Delegate.Remove 你可以看看
  • 打赏
  • 举报
回复
你要用反射看看控件的EventName对不对
我是沒头脑 2013-02-26
  • 打赏
  • 举报
回复
引用 4 楼 WANGL_9527 的回复:
别沉,俺的100分.
我也不想,头儿交代下来的,愁啊.小菜鸟都没好日子过
我是沒头脑 2013-02-26
  • 打赏
  • 举报
回复
引用 4 楼 WANGL_9527 的回复:
别沉,俺的100分.
我也不想,头儿交代下来的,愁啊.小菜鸟都没好日子过
李白上明月 2013-02-26
  • 打赏
  • 举报
回复
你的是什么情况,非要用这种方法取消事件; -=不能满足需求嚒; 你这个代码,我以前用过,就是'CellContentClick'没写对,有时候里面的名字不一定就是事件的全拼; 你可以试一下其写法;比如‘OnCellContentClick’ 主要里面那个委托你看不到,谁晓得当初人家写的啥。。
我是沒头脑 2013-02-26
  • 打赏
  • 举报
回复
别沉,俺的100分.
我是沒头脑 2013-02-26
  • 打赏
  • 举报
回复
在线等..求上人.
我是沒头脑 2013-02-26
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
"Event" + eventname是什么,CellContentClick中那里有Event字样
应该是EventDataGridView?我有试过啊,还是null.有人说DataGridView事件都要用"Event_"+"DataGridView"+eventname.同样试过,求帮助.纠结一下午了
bdmh 2013-02-26
  • 打赏
  • 举报
回复
"Event" + eventname是什么,CellContentClick中那里有Event字样

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧