2012-11-01 58 views
1

雖然開發一個包含多個WinForms的當前項目,但我發現自己變得雜亂無章,只是爲了處理窗體的打開/關閉事件。目前我正在處理它們,像這樣..通用/可重複使用的窗體打開/關閉事件

//Declare forms 
myForm mForm1; 
myForm2 mForm2; 

private void btnSomething_Click(object sender, EventArgs e) 
{ 
    if (mForm1 == null) 
    { 
     mForm1 = new myForm(); 
     mForm1.FormClosed += new FormClosedEventHandler(mForm1_FormClosed); 
     mForm1.Show(); 
    } 
    else 
     if (mForm1.WindowState == FormWindowState.Minimized) 
      mForm1.WindowState = FormWindowState.Normal; 
    mForm1.Focus(); 
} 

void mForm1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    mForm1 = null; 
} 

然後再處理每個窗體打開/關閉的一組空白。現在想象一下,不是2種形式,而是5種形式。現在我更加混亂。有沒有一種方法來推廣這一點,讓所有表單都具有相同的事件處理程序?

我想過也許使用「as」語句中的對象發件人,但我不知道如何從那裏找到相關的聲明表單實例。

sender as (form) 

任何想法?

回答

1

您可以輕鬆地概括代碼:

//Declare forms 
myForm mForm1; 
myForm mForm2; 

private void btnSomething_Click(object sender, EventArgs e) 
{ 
    ShowOrUpdateForm<myForm>(ref mForm1); 
} 

void ShowOrUpdateForm<T>(ref Form form) where T : Form 
{ 
    if (form == null) 
    { 
     form = new T(); 
     form.FormClosed += new FormClosedEventHandler(mForm1_FormClosed); 
     form.Show(); 
    } 
    else if (form.WindowState == FormWindowState.Minimized) 
     form.WindowState = FormWindowState.Normal; 

    form.Focus(); 
} 

void mForm1_FormClosed(object sender, FormClosedEventArgs e) 
{ 
    // you cannot refactor this easily 
    if (sender == mForm1) 
     mForm1 = null; 
    else if (sender == mForm2) 
     mForm2 = null; 
} 

如果您想進一步推廣密閉事件處理程序,你應該考慮移動形式的聲明某種數組,字典的名單。這樣你可以很容易地推廣這種方法。

編輯:將ShowOrUpdateForm函數轉換爲泛型。

+0

這可以工作,我會給它一個快速檢查:) –

+0

我可能在我原來的問題中犯了一個錯誤。如果我的表單不是所有類型的myForm,會發生什麼?我們還可以推廣嗎? –

+0

是的,自FormClosed事件在Form類中定義。請注意,泛型方法接受Form,而不是myForm(推測這是繼承Form)。 –

2

讓你的Forms執行一些IFormWithMyEvents

+0

你可能再詳細一點嗎?我只需要重寫基本事件? –