2012-05-10 30 views
0

我正試圖創建一個可重用的函數,可以打開一個表單的單個實例。意思是如果一個表格尚未打開,它應該創建並顯示新表格,如果已經打開,它應該將現有表格放在前面。單個可重用函數打開表單的一個實例

我用下面的函數,

if (Application.OpenForms["FPSStorageDemo"] == null) 
      { 
       FPSStorageDemo fp = new FPSStorageDemo(); 
       fp.Name = "FPSStorageDemo"; 
       fp.Show(); 
      } 
      else 
      { 
       ((FPSStorageDemo)Application.OpenForms["FPSStorageDemo"]).BringToFront(); 
      } 

但我無論我要打開一個表格,一次又一次編寫代碼。但是我需要一個可以完成這項工作的可重複使用的函數。

我寫了一個函數一樣,

void OpenSingleInstanceForm(Type TypeOfControlToOpen) 
     { 
      bool IsFormOpen = false; 
      foreach (Form fm in Application.OpenForms) 
      { 
       if (fm.GetType() == TypeOfControlToOpen) 
       { 
        IsFormOpen = true; 
        fm.BringToFront(); 
        break; 
       } 
      } 

      if (!IsFormOpen) 
      { 
       Object obj = Activator.CreateInstance(TypeOfControlToOpen); 
       //obj.Show(); //Here is the problem 
      } 
     } 

但在最後,我不知道如何來顯示新的表單實例。任何人都可以建議如何做到這一點?這是錯誤的還是有另一種方式來做到這一點?

在此先感謝。

+1

讓它工作。 ((表格)OBJ).Show();這解決了我的問題 – Matt

回答

1
public static class FormUtility 
{ 
public static FormType GetInstance<FormType>() where FormType : Form, new() 
{ 
    FormType output = Application.OpenForms.OfType<FormType>().FirstOrDefault(); 
    if(output == null) 
    { 
    output = new FormType(); 
    } 
    //you could add the show/bring to front here if you wanted to, or have the more general method 
    //that just gives a form that you can do whatever you want with (or have one of each). 
    return output; 
} 
} 

//elsewhere 
FormUtility.GetInstance<Form1>.BringToFront(); 

我也想花時間提的是,雖然有這樣的方法是快速和易於使用的,在大多數情況下,他們不是很好的設計。它引導您實踐在全球範圍內訪問表格,而不是確保當表格需要彼此溝通時,他們通過適當的範圍展示適當的信息。它使程序更容易維護,理解,擴展,增加可重用性等。如果您無法確定如何最好地使用兩種或多種表單進行通信,而無需通過公共靜態引用表單(這正是您的表單所需要的),那麼您應該隨時在這裏發佈這個問題,以幫助我們解決問題。