3

前言

登录可以说是一个比较常见的功能点,这里主要说的是登录成功后的跳转问题,我见过很多朋友在写的时候是直接把登录窗体隐藏掉然后将主窗体显示出来,这样虽然功能是实现了但是并不是很优雅,而且在主窗体关闭后还需要对登陆窗体进行手动的清理,否则整个程序进程并没有被关掉,也就造成了资源浪费。以下来分享一个较为优雅的方式来实现。

错误写法

这里我们在登录界面/窗体通过一系列验证后确认用户合法性,紧接着将登录窗体隐藏,显示主窗体。

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();
}

以上这种写法是存在问题的,在进入主窗体后我们并没有把登录窗体的实例销毁而是直接进入到了主窗体,这样带来了两个问题,第一个就是资源浪费,也就是登录窗体始终占用资源,第二个就是我们必须在主窗体关闭后手动关闭当前程序的进程,否则程序不会关闭。这样做有点掩耳盗铃的意思。你可能会想我们直接把登录窗体关了不就行了,思路没毛病,不过在我们刚才写的代码中是不行的。

这里要普及一个基本知识点:我们WinForm程序在启动时会首先进入程序的入口方法也就是Main函数,在这个方法中我们需要指定一个Form实例来作为整个程序的主窗体,这个窗体是用于负责消息循环的,当这个窗体被关闭后当前程序进程便会关闭,所有其他窗体都会随之关闭。那到底如何解决?这便是接下来要说的。

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关闭后程序进程也自然关掉了,也就不用手动关闭了。

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;
}

最后

不到之处还望指出,源码下载:点击下载源码


qylost
3 声望2 粉丝

水之积也不厚,则其负大舟也无力;风之积也不厚,则其负大翼也无力。