2013-01-19 42 views
2

我正在編寫一個應用程序,它使用5個簡單窗體的嚮導式系列。第一種形式NewProfile是從主應用程序MainForm的菜單項打開的,因此是MainForm的子窗體。第二種形式TwoProfile從NewProfile上的按鈕打開。第三種形式ThreeProfile是從TwoProfile上的一個按鈕打開的,以此類推爲所有5種形式。這裏是序列: MainForm - > NewProfile < - > TwoProfile < - > ThreeProfile < - > FourProfile < - > FiveProfile。我的問題是,當任何窗體(NewProfile,TwoProfile,ThreeProfile,FourProfile或FiveProfile)打開時,我不希望用戶能夠創建NewProfile的實例。一次只打開一個子窗體實例c#

我開始實施一個Singleton模式,其中途工作。如果NewProfile打開並且我轉到MainForm並嘗試創建NewProfile的另一個實例,它將起作用。如果NewProfile已被銷燬,則它不起作用,前進到下一個表單並且TwoProfile,ThreeProfile,FourProfile或FiveProfile中的一個已打開。它告訴我NewProfile.IsDisposed是真實的,給我一個對Singleton實例的錯誤引用。

我無法弄清楚如何做我的邏輯,這樣如果TwoProfile,ThreeProfile,FourProfile或FiveProfile中的一個打開,或者NewProfile本身打開,NewProfile將不會被創建。

我希望這是有道理的。我沒有太多的代碼可以發佈,除了我爲我的Singleton做的。

private static NewProfile _instance = null; 
    public static NewProfile Instance 
    { 
     get 
     { 
      if (_instance == null) 
      { 
       _instance = new NewProfile(); 
      } 
      return _instance 
     } 
    } 

謝謝:)

+2

你爲什麼不直接使用含有用戶控件,比你一個窗體只需更改Mainform中的用戶控件,即可保證只打開「一個」表單並將所有用戶控件存儲在列表中,並且您可以下載或下載哪個UC按鈕,以便加載哪個UC加載 – Venson

+1

您可以簡單地隱藏()NewProfile而不是在你打開SecondProfi時銷燬它樂? – Steve

+0

你看過做MDI ..嗎? – MethodMan

回答

1

正如評論所說,每一個「形式」實際上可能是你換一個用戶控件。這樣,你只有一個表格和多個頁面。或者,您可以隱藏表單。

如果你想要多個表單,那麼你可以遍歷所有打開的表單,看看你想檢查的是否打開。如果沒有,您可以打開NewProfile

bool shouldOpenNewDialog = true; 

foreach (Form f in Application.OpenForms) 
{  
    //give each dialog a Tag value of "opened" (or whatever name) 
    if (f.Tag.ToString() == "opened") 
     shouldOpenNewDialog = false;  
} 


if(shouldOpenNewDialog) 
    np = new NewProfile(); 

這是未經測試,但它應該通過所有打開的形式循環,並尋找任何具有Tagopened。如果碰到一個,那麼它將shouldOpenNewDialog標誌設置爲false,並且不會調用NewProfile

+0

非常感謝您的及時回覆!我在表格中付出了很多努力,所以我不想做一堆返工。結果工作是keyboardP的建議的變化。我在MainForm菜單項處理程序中執行了此操作: – user1791622

+1

哎呦,我打算去下一行...嘿嘿。如果(Application.OpenForms.Count> 1) { shouldOpenDialog = false; } if(shouldOpenDialog) { newProfile.Show(); } – user1791622

+0

隨意張貼您的最終代碼作爲答案,然後在幾天內接受它:) – keyboardP

1

我們處理這個問題的方式是擁有一個靜態窗口管理器類,用於跟蹤打開的窗體實例。當用戶執行會導致打開新窗口的操作時,我們首先檢查窗口管理器以查看錶單是否已經打開。如果是這樣,我們將重點放在它上面,而不是創建一個新的實例。

每個打開的窗體都繼承自一個基本窗體實現,它在窗口管理器打開時自動向窗口管理器註冊,並在關閉時刪除其註冊。

這裏是的WindowManager類的一個大致的輪廓:

public class WindowManager 
{ 
    private static Dictionary<string, Form> m_cOpenForms = new Dictionary<string, Form>(); 

    public static Form GetOpenForm(string sKey) 
    { 
     if (m_cOpenForms.ContainsKey(sKey)) 
     { 
      return m_cOpenForms[sKey]; 
     } 
     else 
     { 
      return null; 
     } 
    } 
    public static void RegisterForm(Form oForm) 
    { 
     m_cOpenForms.Add(GetFormKey(oForm), oForm); 
     oForm.FormClosed += FormClosed; 
    } 

    private static void FormClosed(object sender, FormClosedEventArgs e) 
    { 
     Form oForm = (Form)sender; 
     oForm.FormClosed -= FormClosed; 
     m_cOpenForms.Remove(GetFormKey(oForm); 
    } 

    private static string GetFormKey(Form oForm) 
    { 
     return oForm.Name; 
    } 
} 

而且你可以按如下方式使用它:

 Form oForm = WindowManager.GetOpenForm("Form1"); 
     if (oForm != null) 
     { 
      oForm.Focus(); 
      oForm.BringToFront(); 
     } 
     else 
     { 
      oForm = new Form1(); 
      WindowManager.RegisterForm(oForm); 
      // Open the form, etc 
     }