C#窗体间字符串变量传递异常求助:LoggedUserName传递至其他窗体为空
问题根源&解决思路
嘿,这问题其实挺典型的——你每次用new LoggingFrm()去拿LoggedUser,都是创建了一个全新的登录窗体实例,这个新实例和你之前用来登录的那个完全是两个独立的对象,它的LoggedUser属性当然是空的啦!
下面给你几个实用的解决方向,你可以根据自己的项目情况选:
方法1:从主窗体直接传递(最直接)
既然主窗体已经拿到了正确的登录用户名,其他窗体直接从主窗体拿就好:
- 先把主窗体的
LoggedUser改成公共属性:
public string LoggedUser { get; private set; }
- 给第三个窗体加个带参数的构造函数,直接在初始化时传值:
// 第三个窗体的代码 public ThirdForm(string loggedUserName) { InitializeComponent(); lblTest.Text = loggedUserName; }
- 然后在主窗体里打开第三个窗体时:
ThirdForm thirdFrm = new ThirdForm(this.LoggedUser); thirdFrm.Show();
或者你不想改构造函数,也可以给第三个窗体加个公共属性,打开窗体时赋值:
// 第三个窗体 public string LoggedUserName { get; set; } // 主窗体里的调用 ThirdForm thirdFrm = new ThirdForm(); thirdFrm.LoggedUserName = this.LoggedUser; thirdFrm.lblTest.Text = thirdFrm.LoggedUserName; thirdFrm.Show();
方法2:用静态变量存全局登录信息(适合多窗体共享)
如果你的应用很多地方都要用到登录用户名,整个全局静态类存起来最方便:
- 新建一个静态类:
public static class AppGlobals { public static string LoggedUserName { get; set; } }
- 登录成功时给这个静态变量赋值:
// LoggingFrm的btnLogIn_Click里 if (IsLogin(user, pass)) { MessageBox.Show($"Logged as {user}!"); AppGlobals.LoggedUserName = tbUser.Text; Close(); }
- 主窗体里也可以同步更新:
if(string.IsNullOrEmpty(AppGlobals.LoggedUserName)) { Close(); } else { LoggedUser = AppGlobals.LoggedUserName; tsslUser.Text = LoggedUser; }
- 第三个窗体直接拿就行:
lblTest.Text = AppGlobals.LoggedUserName;
方法3:用事件传递(更解耦的方式)
如果想让代码更灵活、解耦,可以在登录窗体触发登录成功事件,主窗体订阅后更新状态,其他窗体也能监听:
- 在LoggingFrm里定义事件:
public event EventHandler<string> OnLoginSuccess; private void btnLogIn_Click(object sender, EventArgs e) { String user = tbUser.Text; String pass = tbPassword.Text; if (IsLogin(user, pass)) { MessageBox.Show($"Logged as {user}!"); // 触发事件,把用户名传出去 OnLoginSuccess?.Invoke(this, user); Close(); } else { MessageBox.Show($"User {user} not found!"); } }
- 主窗体订阅这个事件:
public void Form1_Load(object sender, EventArgs e) { LoggingFrm newLogin = new LoggingFrm(); newLogin.OnLoginSuccess += NewLogin_OnLoginSuccess; newLogin.ShowDialog(); } private void NewLogin_OnLoginSuccess(object sender, string userName) { LoggedUser = userName; tsslUser.Text = userName; // 也可以同步到静态变量,方便其他窗体使用 AppGlobals.LoggedUserName = userName; }
内容的提问来源于stack exchange,提问作者Oezu
相关产品推荐
相关产品推荐

