登陸能夠說是一個比較常見的功能點,這裏主要說的是登陸成功後的跳轉問題,我見過不少朋友在寫的時候是直接把登陸窗體隱藏掉而後將主窗體顯示出來,這樣雖然功能是實現了可是並非很優雅,並且在主窗體關閉後還須要對登錄窗體進行手動的清理,不然整個程序進程並無被關掉,也就形成了資源浪費。如下來分享一個較爲優雅的方式來實現。app
這裏咱們在登陸界面/窗體經過一系列驗證後確認用戶合法性,緊接着將登陸窗體隱藏,顯示主窗體。ide
private void btnLogin_Click(object sender, EventArgs e) { //驗證輸入合法性.... //驗證用戶信息.... this.Hide(); FrmMain frmMain = new FrmMain(); frmMain.Show(); }
這裏咱們還須要在主窗體的關閉事件中將當前程序進程進行手動關閉。函數
private void FrmMain_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); }
以上這種寫法是存在問題的,在進入主窗體後咱們並無把登陸窗體的實例銷燬而是直接進入到了主窗體,這樣帶來了兩個問題,第一個就是資源浪費,也就是登陸窗體始終佔用資源,第二個就是咱們必須在主窗體關閉後手動關閉當前程序的進程,不然程序不會關閉。這樣作有點掩耳盜鈴的意思。你可能會想咱們直接把登陸窗體關了不就好了,思路沒毛病,不過在咱們剛纔寫的代碼中是不行的。this
這裏要普及一個基本知識點:咱們WinForm程序在啓動時會首先進入程序的入口方法也就是Main函數,在這個方法中咱們須要指定一個Form實例來做爲整個程序的主窗體,這個窗體是用於負責消息循環的,當這個窗體被關閉後當前程序進程便會關閉,全部其餘窗體都會隨之關閉。那到底如何解決?這即是接下來要說的。spa
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new FrmLogin()); } }
這裏咱們在Main函數中添加了幾行代碼,咱們再也不是直接使用Application.Run(new FrmMain())
了,咱們首先將登陸窗體加載了出來,而後等待ShowDialog的結果,由於ShowDialog以後的代碼會進入等待狀態,因此只有咱們登陸結果出來後下邊的代碼纔會獲得執行,若登陸成功則加載主窗體,不然結束當前程序進程。這樣咱們的FrmMain
承擔了主窗體的任務,而非是咱們的FrmLogin
來做爲主窗體了。這樣咱們在FrmMain
關閉後程序進程也天然關掉了,也就不用手動關閉了。code
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); //首先載入登陸窗體實例 FrmLogin frmLogin = new FrmLogin(); DialogResult loginResult = frmLogin.ShowDialog(); //若登陸成功則加載主窗體 if (loginResult == DialogResult.OK) { Application.Run(new FrmMain()); } else { //登陸失敗則關閉當前程序進程 Application.Exit(); } } }
private void btnLogin_Click(object sender, EventArgs e) { //驗證輸入合法性.... //驗證用戶信息.... this.DialogResult = DialogResult.OK; }
不到之處還望指出,源碼下載:點擊下載源碼orm