使用WinForms开发时,在用户登录系统前,常常需要验证用户名和密码。但验证通过后,验证窗体(下文以frmValidate来指代它)的处理就成了个问题。常见解决方案有以下两种:
1、在验证通过后采用this.Hide()的方式来隐藏验证窗体 (frmValidate)。这是当前几乎所有关于WinForms的教材采用的方式。但很明显,验证通过后frmValidate再也不会使用到,可它却长期占用内存。极不合理。
2、在显示主窗体(下文以mainForm来指代它)后,使用this.Dispose()来释放frmValidate的资源。但很不幸,这次居然连mainForm都随之关闭了,原因是frmValidate为启动窗体。
笔者推荐的解决方案有二:
方案1:设置mainForm为启动窗体,frmValidate作为其弹出窗体,在mainForm的构造函数中显示它。代码如下:
public partial class MainForm : Form //主窗体代码
{
internal bool isValidate = false;
public MainForm()
{
InitializeComponent();
FrmValidate frmValidate = new FrmValidate();
frmValidate.Owner = this; //设置所属窗体,便于在frmValidate中修改isValidate的值
frmValidate.ShowDialog(); //不能使用Show()方法,否则会在显示登录frmValidate的同时,显示
//出调用它的mainForm来
if (!isValidate) //若通过验证,此时isValidate值已在frmValidate中修改为true了。
{
this.Dispose();
}
}
}
public partial class FrmValidate : Form //验证窗体代码
{
public FrmValidate()
{
InitializeComponent();
}
private void btnSubmit_Click(object sender, EventArgs e)
{
if (txtUserID.Text.Trim().Equals("张三娃子") && txtPassword.Text.Trim().Equals("123"))
{
MainForm frm = (MainForm)this.Owner; //获取显示frmValidate的主窗体
frm.isValidate = true; //表示验证通过
this.Dispose(); //释放frmValidate所占用的资源
}
}
}
try //对主函数进行异常处理,因为验证失败时,mainForm已被释放,不能运行了。
{
Application.Run(new MainForm());
}
catch
{
MessageBox.Show("非法用户,系统将关闭!");
}
方案2:单独写一个类(下文中我们称为驱动类),来负责窗体的调用顺序。mainForm中不用做任何处理,frmValidate中验证通过后,设置驱动类的isValidate为true。代码如下:
static class Program
{
internal static bool isValidate = false; //验证是否通过的标志
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main() //驱动用的类和主函数
{
Application.Run(new FrmValidate());
if (isValidate)
{
Application.Run(new MainForm());
}
}
}
public partial class FrmValidate : Form //验证窗体
{
public FrmValidate()
{
InitializeComponent();
}
private void btnSubmit_Click(object sender, EventArgs e)
{
if (txtUserID.Text.Trim().Equals("张三娃子") && txtPassword.Text.Trim().Equals("123"))
{
Program.isValidate = true; //表示验证通过
this.Dispose(); //释放frmValidate所占用的资源
}
}
}
当然,为了驱动类的扩展,最好为isValidate写一个属性,其它类访问时,通过属性来访问它。