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