2013-05-08 93 views
0

Form1,這就造成當一些按鈕被點擊的另一種形式:C#Windows窗體切換

private void ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    Form f5 = new Form5(); 
    f5.Show(); 
} 

當它發生,我需要確定這種形式F5存在,所以如果存在,當按鈕按下時,它會切換到現有表單而不是創建新表單。如果它不存在,則必須創建新表單。 我如何做到這一點,如果我不能檢查一些對象是否存在,直到我宣佈它們? 如何檢查f5的存在之前,我宣佈它,所以我可以創建它只有當沒有這種形式,它是必要的?

回答

4

這樣做的正確的方法是保持對Form5對象的引用,當您創建它。例如,您可以通過聲明一個類級變量來完成此操作。

public class MyForm : Form 
{ 
    private Form5 m_frm5 = null; 

    // ...other code... 

    private void ToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     if (m_frm5 == null) 
     { 
      m_frm5 = new Form5(); 
     } 
     m_frm5.Show(); 
    } 
} 

很明顯,您需要根據您需要訪問表單對象的位置適當地選擇一個範圍。局部變量也可能同樣工作,或者您可能需要將其設置爲整個應用程序的全局變量。

或者,您可以遍歷Application.OpenForms集合,檢查Form5的實例是否已經創建。

private void ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    foreach (Form f in Application.OpenForms) 
    { 
     if (f.GetType() == typeof(Form5)) 
     { 
      f.Show(); 
      return; 
     } 
    } 

    Form5 frm5 = new Form5(); 
    frm5.Show(); 
} 

臨提示:選擇適合您的窗體類比默認值的詳細描述性的名稱。 Form5沒有告訴我什麼。

+0

+1引用'Application.OpenForms' – 2013-05-08 19:28:57

1

創建Form5作爲私有變量。在創建一個新的之前,請檢查它是否存在。

private Form5 form5 = null; 

private void ToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    if(f5 == null || !f5.Visible) 
     f5 = new Form5(); 

    f5.Show(); 
} 
+0

除非你能在別處在這種情況下,你會想在應用範圍上宣佈這個應用程序中創建Form5的一個實例,因此你會知道它是否創建在別的地方。 – Brocco 2013-05-08 19:25:28

+0

@Brocco它也取決於你是否想顯示錶單,如果它是在別處創建的;如果它是在代碼中的此位置創建的,則可能只顯示該表單。 – Servy 2013-05-08 19:26:14

+0

@Brocco OP沒有明確說明這個表單是否可以在別處創建。如果可以,那麼我同意它應該在應用程序級別創建。 – gwin003 2013-05-08 19:27:37

0

我只是讓父代碼的實例部分:

Form f5 = null; 

private void ToolStripMenuItem_Click(object sender, EventArgs e) { 
if (f5 == null) { 
     f5 = new Form5(); 
     f5.Show(); 
    } 
} 

後來編輯:你說得對,你已抓獲了正確的代碼序列:)。礦將只打開一次。

而且我寧願使用的ShowDialog()如果你的應用是不是MDI

+0

如果'f5'不爲空,那麼這個方法就不會做任何事情。無論如何,你應該調用'f5.Show()'。 – gwin003 2013-05-08 19:26:37