2017-06-08 58 views
1

我有兩個表格,LoginForm1。當我點擊btnLogin_ClickLogin形式,它會打開Form1與此代碼:winform隱藏/顯示2表格

private void btnLogin_Click(object sender, EventArgs e) 
{ 
    Form1 pu = new Form1(label2.Text); 
    pu.Show(); 
    pu.FormClosing += Pu_FormClosing; 
    Hide(); 
} 

private void Pu_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    this.Show();    
} 

當我點擊Form1btnExit_Click,它關閉窗體並通過使用此代碼打開Login形式:

private void btnExit_Click(object sender, EventArgs e) 
{ 
    this.Close(); 
} 

現在我想要的是找到一種方式,當我點擊btnExit隱藏Form1並打開Login表單,當我點擊登錄按鈕Login窗體,它顯示Form1而不是創建一個新的實例。

+0

這裏有什麼問題?你爲什麼不能讓它工作? –

+1

如果你需要1表單,然後在應用程序的開始時創建它,而不是每次創建新的實例。 – Vladimir

+0

只需遍歷Application.OpenForms集合來查找已經創建的主表單 – Pikoh

回答

1

一個處理這種方式是創建一個類級變量爲Form1例如:

public partial class Login : Form 
{ 
    private Form1 pu; 

    // code continued below... 

然後在按鈕單擊事件,我們將隱藏的登錄表單,確保pu實例不爲null(如果用戶關閉表單而不是單擊隱藏表單的按鈕,則可能是這種情況),並顯示我們的pu表單實例。

如果實例爲空,那麼它將創建一個新的並掛接事件處理程序。我們將把VisibleChangedFormClosing事件連接到將顯示我們的登錄表單的方法。需要注意的是,在FormClosing情況下,我們實際上取消密切和隱藏的形式:

private void btnLogin_Click(object sender, EventArgs e) 
    { 
     Hide(); 

     if (pu == null) 
     { 
      pu = new Form1(label2.Text); 
      pu.VisibleChanged += Pu_VisibleChanged; 
      pu.FormClosing += Pu_FormClosing; 
     } 

     pu.Show(); 
    } 

    private void Pu_VisibleChanged(object sender, EventArgs e) 
    { 
     // Only show the login form if the form1 is NOT visible 
     if (!pu.Visible) Show(); 
    } 

    private void Pu_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     // Set cancel to true to prevent the form from closing, then hide the form instead 
     e.Cancel = true; 
     pu.Hide(); 
     this.Show(); 
    } 
} 

然後,你需要做的唯一的其他變化是使form1的按鈕Hide形式,而不是關閉它的:

public partial class Form1 : Form 
{ 
    private void btnExit_Click(object sender, EventArgs e) 
    { 
     Hide(); 
    } 

    // rest of class code omitted... 
} 
3

你必須通過Application.OpenForms找到(隱藏)實例:

OpenForms屬性表示由屬於應用程序的形式 只讀集合。此集合可以通過索引 的位置或表單的名稱進行搜索。

using System.Linq; 

... 

Form1 form = Application 
    .OpenForms 
    .OfType<Form1>() 
    .LastOrDefault(); // if we have several Form1 instances, let's take the last one 

if (from == null) // no Form1 instance found, have to create one 
    form = new Form1(); 

form.Show(); 
+0

我剛剛評論過你,但是......現在我不確定OpenForms包含隱藏表單嗎? – Pikoh

+0

@Pikoh:OpenForms中的Open *有點令人誤解:它應該被理解爲*擁有*,*創建句柄*或類似;可見狀態(顯示/隱藏)不會影響'OpenForms' –

+0

是的,這就是我的想法。但我想我記得一些導致隱藏表單從OpenForms中消失的bug,這就是爲什麼我問你 – Pikoh