有的时候我们用到别人的控件,但这个控件本身为DoubleClick已经附加了一个事件处理程序,比如我们双击这个控件的时候会弹出一个窗体,但我们又不想要这个窗体,但我们又不能用DoubleClick-=。。。。。。的方法屏蔽,因为这个事件处理程序是别人写好的,不在我们的代码中,这个时候我们怎么才能干掉原来的DoubleClick处理程序呢?
假如我们所使用的控件类名为testControl,一个实例名叫testControl1,这个控件本身有个DoubleClick处理方法,是弹出一个窗体,这时我要屏蔽掉,可以这么干:
- Type t=typeof(testControl);//或者Type t=testControl1.GetType();
- PropertyInfo propInfo = t.GetProperty("Events", BindingFlags.Instance | BindingFlags.NonPublic);
- EventHandlerList eventHandlers = (EventHandlerList)propInfo.GetValue(testControl1, null);
- FieldInfo fieldInfo =typeof(Control).GetField("EventDoubleClick", BindingFlags.Static | BindingFlags.NonPublic);
- Delegate del= eventHandlers[fieldInfo.GetValue(testControl1)];
- if (del != null)
- {
- foreach (Delegate temp in del.GetInvocationList())
- {
- eventHandlers.RemoveHandler(fieldInfo.GetValue(null), temp);
- }
- }
- //下面加上我们自己为这个事件定义的事件处理程序
- testControl1.DoubleClick+=new EventHandler(testControl1_DoubleClick);
OK,搞定!
另一种方法:
Type t = m_MapService.GetType() ;//或者Type t=testControl1.GetType();
FieldInfo finfo = t.GetField("OnZBST",BindingFlags.NonPublic | BindingFlags .Instance);
Delegate instanceDelegate = finfo.GetValue(m_MapService) as Delegate;
EventInfo eve = t.GetEvent("OnZBST");
foreach (Delegate d in instanceDelegate.GetInvocationList())
{
eve.RemoveEventHandler(m_MapService, d);
}
看了觉得用的上的哥们情去原文帮顶一下!
原文链接:https://blog.youkuaiyun.com/ku_cha_cha/article/details/6994573