2010-01-07 37 views
7

我正在處理一個應用程序,其中有一個主窗體和其他幾個可同時使用的窗體。當用戶點擊打開另一個表單時,我想這樣做是爲了單擊表單按鈕,如果它已經打開,它不會再打開表單。防止顯示一個表單的多個實例

showDialog不會工作,因爲用戶仍然需要訪問主窗體上的控件。

這裏是我的幫助窗口的代碼,所有其他表單都以相同的方式打開。

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Form help = new help(); 
      help.Show(); 
     } 

回答

10

使用單例:

class HelpForm : Form 
{ 
    private static HelpForm _instance; 
    public static HelpForm GetInstance() 
    { 
    if(_instance == null) _instance = new HelpForm(); 
    return _instance; 
    } 
} 

....... 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    HelpForm form = HelpForm.GetInstance(); 
    if(!form.Visible) 
    { 
     form.Show(); 
    } 
    else 
    { 
     form.BringToFront(); 
    } 
} 
+1

當關閉表單時將變量_instance設置爲null將與此完美:) – 2016-03-19 10:30:27

+0

@mletterle您的代碼似乎有錯誤,因爲非靜態變量不能在靜態方法內使用 – ako 2016-08-06 11:45:13

+0

Thanks,fixed .. – mletterle 2016-08-15 14:08:55

2

取決於你如何要管理這個你可以做幾件事情:

  1. 使用Singleton pattern與當表單配置
  2. 管理的狀態時發佈的全球跟蹤鎖定調用表單,如果表單已經啓動,只需調用「show」。
  3. 發射前的形式,但沒有表現出來,你管理一個單一的基準和方法只顯示它需要
-3

嘗試使你的幫助形成全球性的。

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
     if(help == null) 
      help = new help(); 

     help.Show(); 
    } 
+1

downvoter,請解釋。 – junmats 2010-01-07 05:58:37

10

另外,您可以使用應用程序的開放形式,看它是否是開放

btn_LaunchHelp(object o, EventArgs e) 
{ 

    foreach (Form f in Application.OpenForms) 
    { 
     if (f is HelpForm) 
     { 
      f.Focus(); 
      return; 
     } 
    } 

    new help().Show(); 
} 

編輯:爲了更清晰,這使得用戶隨時關閉幫助,並且比保存對幫助窗口的引用更容易管理。沒有什麼要清理,沒有什麼可以維護的。

-1

您是否考慮製作MDI表格?這可確保您的父表單始終可見,並且您的子表單包含在父表單中。然後,你只需要走你的表格列表並打電話給他們看。不需要任何單身人士(許多人認爲這是不好的編程習慣)。

0

也許它會幫助你。

private Form help; 

private void heToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (help == null || (help != null && help.IsDisposed)) 
     { 
      help = new Form(); 
     } 
     if (!help.Visible) 
     { 
      help.Show(); 
     } 
     else 
     { 
      help.BringToFront(); 
     } 
    } 
0

您可以繼續像這樣,在頂部聲明theese 2個變量:

private static readonly object MyLock = new object(); 
private static Form1 _Instance = null; 

並經過

public Form1 GetFormInstance 
{ 
     get 
     { 
      lock (MyLock) 
      { 
       if (_Instance == null || _Instance.IsDisposed) 
       { 
        _Instance = new Form1(); 
       } 
       else 
       { 
        _Instance.BringToFront(); 
       } 
       return Form1._Instance; 
      } 
     } 
} 

放入Form1_FormClosed事件

Form1._Instance = null 

後請像這樣調用表單:

Form1.GetFormInstance.Show(); 

希望它能幫上忙。