C# WinForm多窗体跳转时如何始终显示从数据库查询到的用户名
多窗体跳转后登录用户信息持久化显示解决方案
问题本质:当前每次跳转回HomeScreen时如果重新创建
HomeScreen实例,仅首次初始化时赋值的控件内容不会同步到新实例,就会出现用户信息丢失的情况。
方案1:全局静态类存储用户信息(最通用)
这个方案不需要修改原有窗体创建逻辑,全局所有窗体都可以随时访问登录用户信息:
- 新建静态类存储全局用户信息
public static class GlobalLoginInfo { // 可根据需求扩展用户ID、权限等其他字段 public static string UserName { get; set; } public static byte[] UserAvatar { get; set; } }
- 修改登录逻辑,登录成功后先写入全局静态类
var query = db.Users.Where(x => x.UserName == username.Text && x.PassWord == password.Text) .FirstOrDefault(); if (query != null) { MessageBox.Show("登录成功", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); // 写入全局缓存 GlobalLoginInfo.UserName = query.UserName; GlobalLoginInfo.UserAvatar = query.Image; HomeScreen hs = new HomeScreen(); this.Hide(); hs.Show(); }
- 在
HomeScreen的Form_Load事件中绑定数据,每次窗体加载都会自动读取全局信息赋值
private void HomeScreen_Load(object sender, EventArgs e) { labelControl1.Text = GlobalLoginInfo.UserName; pictureEdit1.EditValue = GlobalLoginInfo.UserAvatar; }
方案2:单例模式保证HomeScreen全局唯一
如果你的业务逻辑要求HomeScreen整个生命周期内只创建一个实例,可以用单例模式避免重复初始化:
- 修改HomeScreen的代码实现单例
public partial class HomeScreen : Form { private static HomeScreen _instance; // 私有化构造函数,禁止外部直接new实例 private HomeScreen() { InitializeComponent(); } // 全局统一获取实例的入口 public static HomeScreen GetInstance() { if(_instance == null || _instance.IsDisposed) { _instance = new HomeScreen(); // 首次创建时绑定全局用户信息 _instance.labelControl1.Text = GlobalLoginInfo.UserName; _instance.pictureEdit1.EditValue = GlobalLoginInfo.UserAvatar; } return _instance; } }
- 所有需要打开HomeScreen的位置,统一调用
GetInstance方法获取实例,不要直接new
HomeScreen hs = HomeScreen.GetInstance(); hs.Show(); hs.BringToFront(); // 把已存在的窗体提到最上层
注意事项
- 不要在全局静态类中存储密码等敏感信息,避免安全风险
- 若支持多账号切换,切换成功后需要同步更新
GlobalLoginInfo中的用户信息 - 如果是MDI容器架构的项目,也可以将用户信息存在MDI父窗体的公共属性中,所有子窗体通过父窗体实例访问
内容的提问来源于stack exchange,提问作者Muhammad saad
相关产品推荐
相关产品推荐

