2011-08-13 45 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)) 
相关问题