2017-06-08 59 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