有的時候我們用到別人的控件,但這個控件本身爲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);
}
看了覺得用的上的哥們幫頂一下!