在网上找到 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')是不好用的.
{
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')是不好用的.
解决方案 »
- 用Winform程序访问网页问题
- 怎么样用SerialPort获取手机卡(SIM卡)的卡号
- 如何将字符串写入XML文件
- 为什么这样不能更新datagrid中数据。
- 数组越界的问题,请指教,谢谢!
- 怎样实现C# RichTextBox续打功能?
- C#中如何调用CryptProtectData 加密远程桌面 rdp 密码?
- 我是用C#做WINFORM,数据是ACCESS,数据列是英文(如:id name,tel...),winfrom窗口中DATAGRIDVIEWS是通过代码显示,显示列也是英文,
- 求哪位能把这个函数转为delphi吗?
- c#一个服务器接收多个客户端的图片信息 连接一个客户端时可以正常接收图片,但是连接2个以上的客户端就报错
- vs2012 打包问题
- 网站自动发送站内消息
应该是EventDataGridView?我有试过啊,还是null.有人说DataGridView事件都要用"Event_"+"DataGridView"+eventname.同样试过,求帮助.纠结一下午了
-=不能满足需求嚒;
你这个代码,我以前用过,就是'CellContentClick'没写对,有时候里面的名字不一定就是事件的全拼;
你可以试一下其写法;比如‘OnCellContentClick’ 主要里面那个委托你看不到,谁晓得当初人家写的啥。。
{
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); }