2016-09-28 36 views
4

我得到了一個代碼來打開我的表單沒有任何重複,但我想爲此創建一個方法,以避免代碼冗餘。C#重複打開表單代碼冗餘

我的代碼:

private void form1ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     foreach (Form openForm in Application.OpenForms) 
     { 
      if (openForm.GetType() == typeof(form1)) 
      { 
       openForm.Activate(); 
       return; 
      } 
     } 

     form1 f1 = new form1(); 
     f1.MdiParent = this; 
     if (!f1.IsDisposed) 
      f1.Show(); 
    } 

我想做什麼:

public void formOpener(Form form, string formName) 
{ 
    foreach (Form openForm in Application.OpenForms) 
    { 
     if (openForm.GetType() == typeof(form)) 
     { 
      openForm.Activate(); 
      return; 
     } 
    } 

    form formName = new form(); 
    formName.MdiParent = this; 
    if (!formName.IsDisposed) 
     formName.Show(); 
} 

private void form1ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    formOpener(form1); 
} 

我與參數的一些問題。 感謝您的任何答案!

+1

什麼問題,你有 –

+0

你有一個字符串參數表格名稱和聲明呼籲表格名稱也表單局部變量。 – Jersono

+0

是你的窗體類真的叫做「form」嗎?根據慣例,這是一個錯誤的名稱,可能會導致一些問題,特別是因爲您也是一個名爲「form」的方法參數。 – HimBromBeere

回答

7

類似的東西?:

public void formOpener<T>() where T : Form, new() 
{ 
    var openedForm = Application.OpenForms.OfType<T>().FirstOrDefault(); 

    if (openedForm != null) 
    { 
     openedForm.Activate(); 
     return; 
    } 

    T newForm = new T(); 
    newForm.MdiParent = this; 
    newForm.Show(); 
} 

OfType<T>擴展方法需要using System.Linq;

使用

formOpener<Form1>(); 

這將顯示形式,如果有任何打開的。否則,將創建一個新的。

如果您可以有多種形式的T型開放,那麼使用Name屬性來區分它們。

public void formOpener<T>(string formName) where T : Form, new() 
{ 
    var openedForm = Application.OpenForms.OfType<T>() 
     .Where(x => x.Name == formName).FirstOrDefault(); 
} 
+0

它找到可以轉換爲T的形式,這可能不是您所期望的所有情況。 –

+0

@AntonínLejsek我看到,OP似乎一次只有一個。 *編輯:*包括該案例的解決方案 –

+0

感謝您的完美答案! –