2009-12-23 56 views
0

有一個私人無效btnContBalloon_Click(對象發件人,EventArgs e)。我可以使這個靜態,因爲我想從靜態方法調用,但我不能。使btn_Click事件靜態

回答

4

讓事件靜止是拍攝腳部的好方法。靜態事件具有無限的生命週期。這使得您爲事件註冊的任何事件處理程序都可以永遠活着。這使得包含這樣一個事件處理程序的任何表單都可以永遠存在。泄漏。

註冊一個靜態事件的事件處理程序需要代碼,例如,顯式取消註冊該處理程序的FormClosing事件處理程序。您可以在MSDN Library文章中明確記錄SystemEvents類,這是.NET框架中具有靜態事件的一個類的少數幾個示例之一。

更好的方法是跟蹤其按鈕的Click事件應該被激活的表單實例。事情是這樣的:

public partial class Form1 : Form { 
    public static Form1 MainForm { get; private set; } 
    public Form1() { 
     InitializeComponent(); 
     MainForm = this; 
    } 
    public void RunClickMethod() { 
     button1.PerformClick(); 
    } 
    protected override void OnFormClosing(FormClosingEventArgs e) { 
     MainForm = null; 
     base.OnFormClosing(e); 
    } 
    } 

這允許客戶端代碼執行此操作:

Form1.MainForm.RunClickMethod(); 
1

是的,如果該方法不需要封閉類的實例成員,那麼可以使其成爲靜態。如果這是真正的問題,則什麼都不能阻止事件處理程序變爲靜態。

底線:如果該方法僅使用發送對象(可能的按鈕)和事件參數或其他靜態成員,那麼這是非常有效的和可能的。

+0

但你不應該從上下文從事件處理不同的調用的事件處理程序,爲什麼不給裏面調用剛纔的邏輯? – Restuta

+0

同意。我也會對這個用例感興趣。雖然我猜想可以通過將相關代碼抽取到靜態方法中並從事件處理函數和第二個(靜態)上下文中調用相關代碼來改進設計。 –

+0

@restuta調用邏輯內部不起作用,所以它是必要的 – Harikrishna

0

一般情況:是的,可以將事件處理程序設爲靜態。但是靜態方法的正常規則適用。

但是,當您將自動生成的事件處理程序更改爲靜態時,自動生成的代碼通常會遇到麻煩。我只會用手動添加事件處理程序來完成此操作。