登陆能够说是一个比较常见的功能点,这里主要说的是登陆成功后的跳转问题,我见过不少朋友在写的时候是直接把登陆窗体隐藏掉而后将主窗体显示出来,这样虽然功能是实现了可是并非很优雅,并且在主窗体关闭后还须要对登录窗体进行手动的清理,不然整个程序进程并无被关掉,也就形成了资源浪费。如下来分享一个较为优雅的方式来实现。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