2011-08-13 52 views
0

使用按鈕單擊事件中的以下代碼可以刪除事件處理程序。使用代碼刪除事件處理程序

Button btn = new Button(); 
this.Controls.Add(btn); 
btn.Click += (o, x) => 
{ 
    Button b = o as Button; 
    FieldInfo eventclick = typeof(Control).GetField("EventClick", BindingFlags.Static | BindingFlags.NonPublic); 
    object eventValue = eventclick.GetValue(b); 
    PropertyInfo events = b.GetType().GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance); 
    EventHandlerList eventHandlerList = (EventHandlerList)events.GetValue(b, null); 
    eventHandlerList .RemoveHandler(eventValue, eventHandlerList [eventValue]); 
    MessageBox.Show("Test"); 
}; 

但我想從vgridcontrols CellValueChanged事件中刪除事件處理程序。我需要在以下內容中爲「EventClick」撰寫什麼內容?

FieldInfo eventclick = typeof(Control).GetField(
    "EventClick", 
    BindingFlags.Static | BindingFlags.NonPublic); 
+4

歸屬是SO所必需的。不鏈接你發現的答案實際上阻止你得到一個很好的答案。 –

+0

我試過了不行 – YardimaIhtiyaciOlan

回答

4

不能可靠從事件刪除事件處理程序,除非你已經有一個「平等」的代表,您可以在正常的方式使用-=使用。

讓反射和黑客入侵字段是明顯違反封裝使您的代碼非常脆弱。我會強烈建議不要這樣做。

目前尚不清楚你所說的「vgridcontrols」(DataGridView?),但任何解決方案,你拿出註定是實現特定的意思 - 而執行可以很容易地與不管它是下一個版本的改變。

相反,把時間放在一個設計中,你可以根本不需要移除事件處理程序,或者保留對處理程序的引用,並且可以以正常方式刪除它。

0

這是VB.NET,但您可以輕鬆將其修改爲C#。這是你想要的:

'Remove the handler from the cell value changed 
Dim gv As DataGridView = Me.equipmentGridView 
Dim fInf As FieldInfo = GetType(DataGridView).GetField("EVENT_DATAGRIDVIEWCELLVALUECHANGED", BindingFlags.Static Or BindingFlags.NonPublic) 
Dim del As Object = fInf.GetValue(gv) 
Dim pInf As PropertyInfo = gv.GetType().GetProperty("Events", BindingFlags.NonPublic Or BindingFlags.Instance) 
Dim evList As EventHandlerList = pInf.GetValue(gv, Nothing) 
evList.RemoveHandler(del, evList(del)) 
相關問題