我们编写程序时,基本每次都需要一个登录框来进行登录。
通常我们的逻辑是这样的,让用户输入用户名、密码,如果验证成功则主窗体显示,登录窗口关闭。
<span style="font-size:18px;"><strong>if ( textBox1.Text == "1" && textBox2.Text=="1")
{
frmMain fm = new frmMain();
fm.Show();
this.Close ();
}
</strong></span>
这样逻辑上是对的,可是当我们真正的运行程序时会发现,主窗体闪一下,随之就关闭了。不用怀疑就是代码有问题,我们简单的改一下。
<span style="font-size:18px;"><strong>if ( textBox1.Text == "1" && textBox2.Text=="1")
{
frmMain fm = new frmMain();
fm.Show();
this.Hide();
}
</strong></span>
这次登录成功了,我们发现我们的改动只是将登录窗体的关闭改为了隐藏,这时候登录成功,并且,就算主窗体出现后你再运行一句frmlogin.close(),所有已经打开的窗体都会关闭。
为什么让frmlogin.close()会出现问题呢?
因为主窗体是由登录窗口打开的,所以当我们关闭登录窗口是,主窗口也会被关闭,这是一个线程树或窗口树的关系,一个窗口关闭时,由它打开的所有的窗口都将关闭。
怎么解决这个问题呢?
直接让frmlogin.hide()不就行了吗,这可是会占用内存的,这样登录窗体只是被隐藏了,而没有被关闭,就算关闭frmMain这个窗体,该程序的进程还是在运行的。有没有更加专业的解决办法,答案是有的。
只要将Program.cs的应用运行代码加一个判断条件就可以了。
Program.cs中的代码:
<span style="font-size:18px;"><strong> frmLogin fl = new frmLogin();
fl.ShowDialog(); //将窗体显示为模式对话框
if (fl.DialogResult == DialogResult.OK)
{
Application.Run(new frmMain());
}
else
{
return;
}</strong></span>
登录窗体中的代码:
<span style="font-size:18px;"><strong> if ( textBox1.Text == "1" && textBox2.Text=="1")
{
this.DialogResult = DialogResult.OK;
this.Close();
}</strong></span>