2012年6月15日 星期五

C# - 如何移除未知名稱的事件 - LookupEdit.KeyDown


之前寫過【C# 如何移除未知名稱的事件 - BarButtonItem.Click】,
然後剛好今天又要用到相關的觀念,
只不過今天要移除的是 LookupEdit.KeyDown ,
所以基本上這一篇只是紀錄一下,
萬一以後要用的時候可以直接拿來用這樣!

程式碼如下:


private void RemoveKeyDownEvent(System.Windows.Forms.Control ctrl)
{
    //FieldInfo keyDownInfo = (typeof(DevExpress.XtraEditors.LookUpEdit)).GetField("EventKeyDown",
    FieldInfo keyDownInfo = (typeof(Control)).GetField("EventKeyDown",
        BindingFlags.Static | BindingFlags.NonPublic);

    FieldInfo eventsInfo = (typeof(Component)).GetField("events",
        BindingFlags.Instance|BindingFlags.NonPublic);

    object keyDown = keyDownInfo.GetValue(ctrl);

    EventHandlerList events = eventsInfo.GetValue(ctrl) as EventHandlerList;

    if (events == null) return;

    KeyEventHandler handler = events[keyDown] as KeyEventHandler;

    Delegate d = events[keyDown];

    if (d != null)
    {
        events.RemoveHandler(keyDown, d);
    }
}


要提是的重點是我們必須先要知道要移除的事件是在哪一個階層新增的,
以這個 KeyDown 的事件來說,
其實它是在 System.Windows.Forms.Control 的這個 class 裡面新增的事件,
請參閱【Control.KeyDown 事件】;
所以我們要取得 EventKeyDown 的 FieldInfo 的時候,
其實我們必須要從 Control 取得,
所以程式會是寫成下面這樣!


FieldInfo keyDownInfo = (typeof(Control)).GetField("EventKeyDown",
BindingFlags.Static | BindingFlags.NonPublic);


而不是我 remark 起來的這樣!


FieldInfo keyDownInfo = (typeof(DevExpress.XtraEditors.LookUpEdit)).GetField("EventKeyDown",
BindingFlags.Static | BindingFlags.NonPublic);


所以先找出事件在哪一個 class 新增的是很重要的!
然後我們就可以把事件的表頭改成下面這樣,

private void RemoveKeyDownEvent(System.Windows.Forms.Control ctrl)

如此一來所有從 Control 繼承下來的物件都可以直接呼叫這個函數來使用了!
然後呼叫的時候直接寫成這樣:

RemoveKeyDownEvent((Control)lookupEdit);

所以結論是.......
這個跟 DevExpress.XtraEditors.LookUpEdit 根本就不相干!哈~~~
大公告成,收功~~~

重要

沒有留言:

張貼留言