2011-07-12 47 views
1

我有一個派生自System.Windows.Form.Form的「MyForm」。 MyForm處理FormClosed事件,該事件的處理程序是在構造函數中設置的。實例化的MyForm對象是否可以使用 - =成功地刪除我的MyClass#FormClosed處理程序?如果重要,我使用匿名方法來連接我的FormClosed事件。從類實例派生類中刪除( - =)Form#FormClosed事件添加(+ =)?

// In MyForm Constructor, this ALWAYS gets fired... 
FormClosed += (_sender, _args) => { m_mutex.Dispose(); m_mutex = null; }; 

// In Instantiating Class 
MyForm form = new MyForm(); 
form.FormClosed += (_sender, _args) => { }; 

// I have also tried using "delegate(object sender, EventArgs e)" and neither worked. 
+0

也許提供您當前訂閱和取消訂閱的樣本... ???而且,你自己試過這個嗎? – IAbstract

+0

[Event event fires more times times]可能的重複(http://stackoverflow.com/questions/6200424/event-fires-more-and-more-times) –

+0

@Abstract - 我試過了我相信的東西成爲正確的匿名簽名,但未成功刪除。 – gangelo

回答

3

是的,你可以刪除它 - 但如果你已經使用了匿名函數,它有點棘手。

基本上你會要麼需要停止使用匿名函數(即把行爲放到一個方法)你需要有一個字段存儲代表的價值:

private EventHandler formClosedHandler; 
... 

// In constructor 
formClosedHandler = (sender, args) => { ... }; 
FormClosed += formClosedHandler; 

// Later... 
FormClosed -= formClosedHandler; 
formClosedHandler = null; 

個人而言,我傾向於將邏輯轉移到方法中,除非由於某些原因它非常棘手。

+0

我感到很高興,這是我打字的答案:)誰會想我會像Jon Skeet一樣思考? – ckramer

+0

我已經對這種形式變得很自在了:'formClosedHandler =(sender,args)=> {...};'。這使得處理un-subbing&cleanup非常容易。 – IAbstract

0

是的,您可以退訂任何事件,即使在Disposed()方法中也是如此。