程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> Win Forms開發時,如何合理釋放驗證窗體

Win Forms開發時,如何合理釋放驗證窗體

編輯:.NET實例教程

使用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寫一個屬性,其它類訪問時,通過屬性來訪問它。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved