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
相关产品推荐
相关产品推荐

