You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 14:32:48