2011-07-31 94 views
0

我加入這樣的如何刪除事件?

Button button = new Button(); 

button.Click += (o,e) => 
{ 
//Somecode 
}; 

如何刪除這個事件的事件嗎?

+0

你如何添加這樣的事件?這甚至不會編譯。 – BoltClock

+0

它缺少'+ =',但其餘的是有效的代碼,它是一個lambda方法。 – Femaref

+0

而不是刪除事件添加類成員作爲一種「標誌」 - 當提出時,忽略點擊。 –

回答

-1

這可能有幫助;

 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"); 
     }; 
1

簡短的回答:你不能,你只能通過-=刪除事件的處理程序。如果你想刪除處理程序,那麼不要使用匿名方法。而不是使用預定義的方法,如:

button.Click += OnButtonClick; 

private void OnButtonClick(object sender, EventArgs e) 
{ 
    //some code 
} 
7

正確的語法是

button.Click += (o, e) => { /*code*/ }; 

你不能刪除,因爲它是一個anomynous方法(拉姆達)。如果您希望能夠移除事件處理程序,則必須將代碼移至其他方法。

如果您保存lambda作爲一個代表:

EventHandler<EventArgs> handler = (o, e) => { //code }; 

您可以添加/刪除:

button.Click += handler; 
button.Click -= handler; 

不過,我會強烈反對這一點。改用一個命名方法。

+0

+1,對於「lambda方式」,實際上是在想它是怎樣的。 – Tigran

+0

-1我很肯定你可以刪除lambdas,如果你存儲它。 – CodesInChaos

+0

是的,你是對的。 – Femaref

1

如果您存儲委託,則可以這樣做。

Button button=new Button(); 

EventHandler<...> handler=(o,e)=> 
{ 
//Somecode 
} 

button.Click+=handler; 
button.Click-=handler; 

但我建議使用一個名爲方法來代替。我看不到在這裏使用lambda的好處。

+0

+1最接近OP要求的內容(禁止他的語法錯誤)。它不是必需的*,可以通過匿名代理使用命名方法,只需*推薦*。 – BoltClock