코드

2011-08-13 4 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

표시가 필요합니다. 실제로 찾은 답을 연결하지 않으면 좋은 답을 얻지 못할 수 있습니다. –

+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))