Win Forms开发时,如何合理释放验证窗体

本文介绍在WinForms应用中实现登录验证的方法,包括如何避免验证窗体占用内存及防止主窗体意外关闭的问题,并提供两种解决方案。

使用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中验证通过后,设置驱动类的isValidatetrue。代码如下:

 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写一个属性,其它类访问时,通过属性来访问它。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值