C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C#登录跳转

C# Winform设置登录跳转的四种方式总结

作者:张謹礧

这篇文章主要为大家详细介绍了C# Winform设置登录跳转的四种方式,所有代码可直接复制到项目中使用,同时说明各方式的核心差异和注意事项

整理了4 种实用且完整的登录跳转方式(含基础版、优化版、MDI 版,补充了子线程安全跳转),每种方式都包含前置窗体创建、完整代码、程序入口、运行效果、适用场景,所有代码可直接复制到项目中使用,同时说明各方式的核心差异和注意事项。

通用前置准备

先在 WinForm 项目中创建两个基础窗体,统一命名方便复用:

所有方式的登录验证基础逻辑一致(实际项目可替换为数据库 / 配置文件验证),下文仅替换登录成功后的跳转代码即可。

方式 1:隐藏登录窗 + 显示主窗体(最常用,推荐)

核心逻辑

登录成功后隐藏登录窗体(Hide()),实例化主窗体并显示,同时给主窗体绑定FormClosed事件 —— 主窗体关闭时自动关闭登录窗体,保证程序正常退出(避免登录窗后台驻留)。

完整实现代码

1. 登录窗体(FrmLogin)- 登录按钮点击事件

using System;
using System.Windows.Forms;

namespace WinFormLoginJump
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        // 登录按钮点击事件(双击按钮自动生成)
        private void btnLogin_Click(object sender, EventArgs e)
        {
            // 1. 获取并清洗输入的账号密码
            string account = txtAccount.Text.Trim();
            string pwd = txtPwd.Text.Trim();

            // 2. 简单登录验证(实际项目替换为数据库/Redis/配置文件验证)
            if (string.IsNullOrEmpty(account) || string.IsNullOrEmpty(pwd))
            {
                MessageBox.Show("账号和密码不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            if (account == "admin" && pwd == "123456")
            {
                // 3. 登录成功,执行核心跳转逻辑
                FrmMain mainFrm = new FrmMain();
                // 给主窗体传值:显示当前登录账号(实用拓展)
                mainFrm.LoginUser = account;
                // 绑定主窗体关闭事件:主窗体关闭则关闭登录窗,程序退出
                mainFrm.FormClosed += (s, args) => { this.Close(); };
                // 显示主窗体
                mainFrm.Show();
                // 隐藏登录窗体
                this.Hide();
            }
            else
            {
                MessageBox.Show("账号或密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 清空密码框,聚焦账号框(优化体验)
                txtPwd.Clear();
                txtAccount.Focus();
            }
        }
    }
}

2. 主窗体(FrmMain)- 接收登录账号并显示

using System.Windows.Forms;

namespace WinFormLoginJump
{
    public partial class FrmMain : Form
    {
        // 定义公共属性,接收登录窗体传递的账号
        public string LoginUser { get; set; }

        public FrmMain()
        {
            InitializeComponent();
        }

        // 主窗体加载事件(双击窗体空白处/属性窗口添加)
        private void FrmMain_Load(object sender, EventArgs e)
        {
            // 显示当前登录用户
            lblLoginUser.Text = $"当前登录:{LoginUser},欢迎使用系统!";
        }
    }
}

3. 程序入口(Program.cs)- 默认无需修改

using System;
using System.Windows.Forms;

namespace WinFormLoginJump
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            // 程序启动先显示登录窗体,作为默认入口
            Application.Run(new FrmLogin());
        }
    }
}

运行效果

适用场景 & 优缺点

方式 2:关闭登录窗 + 重新启动主窗体(释放登录窗资源)

核心逻辑

登录成功后直接关闭登录窗体this.Close()),通过Application.Run(new FrmMain())重新启动程序的消息循环,将主窗体作为程序新入口,登录窗体资源被完全释放。

完整实现代码

1. 登录窗体(FrmLogin)- 仅修改登录成功后的跳转代码

其他验证逻辑和方式 1 一致,仅替换登录成功的代码块:

// 登录成功,核心跳转逻辑(替换方式1的对应代码)
FrmMain mainFrm = new FrmMain();
mainFrm.LoginUser = account;
// 关闭登录窗体(退出原消息循环,释放登录窗资源)
this.Close();
// 重新启动消息循环,将主窗体作为程序新入口
Application.Run(mainFrm);

2. 主窗体(FrmMain)& 程序入口(Program.cs)

和方式 1 完全一致,无需修改

运行效果

关键注意点

如果需要禁止用户通过右上角叉号关闭登录窗(强制通过登录按钮操作),可在 FrmLogin 中添加FormClosing事件:

// FrmLogin的窗体关闭事件(属性窗口找到FormClosing双击)
private void FrmLogin_FormClosing(object sender, FormClosingEventArgs e)
{
    // 仅禁止用户手动点击叉号关闭,其他关闭方式(如代码this.Close())不影响
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true; // 取消关闭操作
        MessageBox.Show("请通过登录按钮完成系统进入!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}

适用场景 & 优缺点

方式 3:MDI 多窗体架构的登录跳转(企业级项目)

核心场景

适用于多模块企业级项目(如 ERP、管理系统),存在一个MDI 主容器窗体,所有功能子窗体都在主窗体内显示,需先登录再打开 MDI 主窗体。

核心前提

MDI 主窗体FrmMain需设置为MDI 容器IsMdiContainer = true),一个程序只能有一个 MDI 容器,所有子窗体需指定MdiParent为 MDI 主窗体。

完整实现代码

1. 新增子窗体(FrmHome)- 作为 MDI 主窗体的首页

右键项目→添加→Windows 窗体→命名FrmHome,简单添加一个Label显示 “系统首页” 即可。

2. MDI 主窗体(FrmMain)- 设置为 MDI 容器

using System.Windows.Forms;

namespace WinFormLoginJump
{
    public partial class FrmMain : Form
    {
        public string LoginUser { get; set; }
        public FrmMain()
        {
            InitializeComponent();
            // 关键:设置为MDI容器(也可在属性窗口直接设置IsMdiContainer = true)
            this.IsMdiContainer = true;
            // 优化体验:主窗体最大化、设置标题
            this.WindowState = FormWindowState.Maximized;
            this.Text = "系统管理平台-MDI主窗体";
        }

        private void FrmMain_Load(object sender, EventArgs e)
        {
            lblLoginUser.Text = $"当前登录:{LoginUser} | MDI系统管理平台";
            // 自动加载首页子窗体(登录成功后直接显示)
            LoadHomeFrm();
        }

        // 封装加载首页子窗体的方法
        public void LoadHomeFrm()
        {
            FrmHome homeFrm = new FrmHome();
            homeFrm.MdiParent = this; // 关键:指定父窗体为MDI主窗体
            homeFrm.Text = "系统首页";
            homeFrm.Show();
        }
    }
}

3. 登录窗体(FrmLogin)- MDI 架构跳转代码

使用隐藏登录窗的逻辑(推荐,方便后续重新登录),代码和方式 1 基本一致,无额外修改:

// 登录成功后的跳转代码(和方式1完全一致)
FrmMain mdiMain = new FrmMain();
mdiMain.LoginUser = account;
mdiMain.FormClosed += (s, args) => { this.Close(); };
mdiMain.Show();
this.Hide();

4. 程序入口(Program.cs)

和方式 1 完全一致,无需修改

运行效果

关键注意点

适用场景 & 优缺点

方式 4:子线程验证 + 跨线程安全跳转(优化体验)

核心场景

实际项目中,登录验证可能涉及数据库查询、网络请求(耗时操作),若在主线程执行会导致登录窗 “卡死”,因此需要在子线程中做验证,验证成功后跨线程安全跳转到主窗体(WinForm 控件仅能在主线程操作)。

完整实现代码

1. 登录窗体(FrmLogin)- 子线程验证 + 跨线程跳转

需引入System.Threading,核心是用Invoke实现跨线程操作控件 / 跳转:

using System;
using System.Windows.Forms;
using System.Threading;

namespace WinFormLoginJump
{
    public partial class FrmLogin : Form
    {
        public FrmLogin()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string account = txtAccount.Text.Trim();
            string pwd = txtPwd.Text.Trim();

            if (string.IsNullOrEmpty(account) || string.IsNullOrEmpty(pwd))
            {
                MessageBox.Show("账号密码不能为空!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            // 禁用登录按钮,防止重复点击(优化体验)
            btnLogin.Enabled = false;
            btnLogin.Text = "验证中...";

            // 开启子线程执行耗时的登录验证
            Thread thread = new Thread(() =>
            {
                // 模拟数据库/网络请求(耗时2秒)
                Thread.Sleep(2000);
                bool isLoginSuccess = (account == "admin" && pwd == "123456");

                // 跨线程操作:WinForm控件只能在主线程修改,需用Invoke
                this.Invoke(new Action(() =>
                {
                    // 恢复登录按钮状态
                    btnLogin.Enabled = true;
                    btnLogin.Text = "登录";

                    if (isLoginSuccess)
                    {
                        // 登录成功,执行方式1的跳转逻辑(隐藏登录窗+显示主窗体)
                        FrmMain mainFrm = new FrmMain();
                        mainFrm.LoginUser = account;
                        mainFrm.FormClosed += (s, args) => { this.Close(); };
                        mainFrm.Show();
                        this.Hide();
                    }
                    else
                    {
                        MessageBox.Show("账号或密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtPwd.Clear();
                        txtAccount.Focus();
                    }
                }));
            });
            // 启动子线程,设置为后台线程(程序退出时自动销毁)
            thread.IsBackground = true;
            thread.Start();
        }
    }
}

2. 主窗体(FrmMain)& 程序入口(Program.cs)

和方式 1 完全一致,无需修改

运行效果

核心知识点

适用场景 & 优缺点

拓展:登录状态的全局保存(实用必备)

登录成功后,主窗体 / 子窗体通常需要全局获取用户信息 / 登录状态(如权限验证、显示账号),推荐 2 种轻量且实用的全局保存方式:

方式 1:静态类(最推荐,轻量灵活)

右键项目→添加→类→命名GlobalInfo,定义静态属性保存全局信息:

namespace WinFormLoginJump
{
    // 全局信息静态类,保存登录状态、用户信息
    public static class GlobalInfo
    {
        // 当前登录用户账号
        public static string LoginAccount { get; set; }
        // 当前登录用户姓名
        public static string LoginName { get; set; }
        // 用户角色(用于权限验证)
        public static string UserRole { get; set; }
        // 登录状态
        public static bool IsLogin { get; set; } = false;
    }
}

登录成功时赋值(FrmLogin 中):

// 登录成功后给全局静态类赋值
GlobalInfo.LoginAccount = account;
GlobalInfo.LoginName = "系统管理员";
GlobalInfo.UserRole = "Admin";
GlobalInfo.IsLogin = true;

任意窗体中获取(如 FrmMain、FrmHome):

// 直接通过类名访问,无需实例化
if (GlobalInfo.IsLogin && GlobalInfo.UserRole == "Admin")
{
    lblTip.Text = $"欢迎{GlobalInfo.LoginName}(超级管理员)";
}

方式 2:窗体构造函数传参(简单场景)

适用于仅主窗体需要用户信息的简单场景,如方式 1 中通过mainFrm.LoginUser = account传参,适合轻量需求。

总结

4 种登录跳转方式各有适用场景,核心选择原则:

所有方式的代码均可直接复制复用,仅需根据实际项目修改登录验证逻辑(如替换为数据库查询)和窗体控件名称即可。

到此这篇关于C# Winform设置登录跳转的四种方式总结的文章就介绍到这了,更多相关C#登录跳转内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文