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

C#:如何从Form1传递变量至另一窗体的用户控件?

解决窗体向用户控件传递变量的实例问题

嘿,我完全懂你现在的困扰!作为C#新手,窗体和用户控件之间的实例传递确实是很容易踩坑的点——你的思路方向是对的(给UserControl加公共属性),但问题出在你操作的navBar不是mainForm里面实际正在使用的那个UserControl实例。

问题根源

你之前的代码里直接给navBar.nameOfUser赋值,但这个navBar要么是一个和mainForm无关的独立实例,要么根本没关联到mainForm内部的导航栏控件。每个new出来的控件都是完全独立的对象,所以你得找到mainForm里那个真正的导航栏实例才能生效。

修正方案一:直接获取mainForm内的UserControl实例

首先确保你在mainForm的设计器里给导航栏UserControl设置了一个明确的Name(比如ucNavBar),然后修改代码:

// User Control 代码(保持不变,建议加Load事件同步Label)
public string nameOfUser { get; set; }

private void navBar_Load(object sender, EventArgs e)
{
    // 把属性值同步到Label上
    lblUserName.Text = nameOfUser;
}
// Form1 修正后的代码
if (dt.Rows.Count == 1)
{
    object a = dt.Rows[0]["forename"];
    string forenameString = Convert.ToString(a);
    
    // 创建mainForm的实例
    mainForm objfrmMain = new mainForm();
    
    // 查找mainForm内的导航栏UserControl实例
    var targetNavBar = objfrmMain.Controls.Find("ucNavBar", true).FirstOrDefault() as navBar;
    if (targetNavBar != null)
    {
        // 给正确的实例设置属性
        targetNavBar.nameOfUser = forenameString;
    }
    
    this.Hide();
    objfrmMain.Show();
}
else
{
    MessageBox.Show("Incorrect Login.");
}

修正方案二:给mainForm加封装方法(更优雅)

为了更好的封装性,建议不要直接操作mainForm内部的控件,而是给mainForm添加一个公共方法或属性来传递用户名:

// mainForm 代码
public void SetNavigationUserName(string userName)
{
    // 假设导航栏UserControl的名字是ucNavBar
    ucNavBar.nameOfUser = userName;
    // 如果需要立即更新Label,可以在这里触发UserControl的更新逻辑
    ucNavBar.UpdateUserNameLabel();
}

// 可选:在UserControl里加一个更新Label的方法
public void UpdateUserNameLabel()
{
    lblUserName.Text = nameOfUser;
}

然后在Form1里调用这个方法:

// Form1 代码
if (dt.Rows.Count == 1)
{
    object a = dt.Rows[0]["forename"];
    string forenameString = Convert.ToString(a);
    
    mainForm objfrmMain = new mainForm();
    // 调用mainForm的封装方法传递用户名
    objfrmMain.SetNavigationUserName(forenameString);
    
    this.Hide();
    objfrmMain.Show();
}
else
{
    MessageBox.Show("Incorrect Login.");
}

关键提醒

记住:每个new出来的对象都是独立的实例,你要操作的必须是目标窗体里已经存在的那个控件实例,而不是随便创建的另一个控件对象。慢慢来,实例的概念是C#的核心基础之一,多试几次就能熟练掌握啦!

内容的提问来源于stack exchange,提问作者Rhys Morrison

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:31:56