C# WinForm中如何让UserControl设置另一个Form的文本框、标签值
C# WinForm 实现UserControl对其他窗体控件赋值的方案及示例
首先明确前提:默认需要被赋值的窗体为TargetForm,包含textBox1、label1两个待赋值控件。WinForm默认控件访问修饰符为private,推荐通过公共属性封装控件的赋值能力,而非直接修改控件访问权限。
方案1:通过公共属性传递窗体实例(适合简单业务场景)
该方案逻辑简单,直接让UserControl持有目标窗体的实例进行赋值操作。
- 首先在
TargetForm中封装控件的赋值属性:
public partial class TargetForm : Form { // 封装TextBox的Text属性 public string TextBoxContent { get => textBox1.Text; set => textBox1.Text = value; } // 封装Label的Text属性 public string LabelContent { get => label1.Text; set => label1.Text = value; } public TargetForm() { InitializeComponent(); } }
- 在UserControl中定义目标窗体实例的公共属性,触发赋值逻辑:
public partial class MyUserControl : UserControl { // 用于接收外部传入的目标窗体实例 public TargetForm TargetFormInstance { get; set; } public MyUserControl() { InitializeComponent(); } // 示例:点击UserControl内的按钮触发赋值 private void btnSubmit_Click(object sender, EventArgs e) { // 空校验避免空引用异常 if (TargetFormInstance == null) return; TargetFormInstance.TextBoxContent = "UserControl传入的文本框内容"; TargetFormInstance.LabelContent = "UserControl传入的标签内容"; } }
- 在两个对象的共同父容器(一般是主窗体)中给UserControl的目标实例属性赋值:
// 主窗体加载时的逻辑示例 private void MainForm_Load(object sender, EventArgs e) { // 打开目标窗体 TargetForm targetForm = new TargetForm(); targetForm.Show(); // 给UserControl传递目标窗体实例 myUserControl1.TargetFormInstance = targetForm; }
方案2:通过委托事件实现(解耦推荐,适合复杂场景)
该方案不需要UserControl持有目标窗体的引用,通过事件通知的方式完成赋值,可维护性更强。
- 在UserControl中定义委托和触发事件:
public partial class MyUserControl : UserControl { // 定义委托:传递需要赋值的两个参数 public delegate void ValuePushDelegate(string textBoxValue, string labelValue); // 定义赋值触发事件 public event ValuePushDelegate OnValuePushed; public MyUserControl() { InitializeComponent(); } // 示例:点击按钮触发赋值事件 private void btnSubmit_Click(object sender, EventArgs e) { // 存在订阅者时触发事件,传递参数 OnValuePushed?.Invoke("文本框赋值内容", "标签赋值内容"); } }
- 在共同父容器中订阅事件,完成赋值逻辑:
// 主窗体加载时的逻辑示例 private void MainForm_Load(object sender, EventArgs e) { TargetForm targetForm = new TargetForm(); targetForm.Show(); // 订阅UserControl的赋值事件 myUserControl1.OnValuePushed += (textVal, labelVal) => { targetForm.TextBoxContent = textVal; targetForm.LabelContent = labelVal; }; }
注意事项
- 如果赋值操作涉及跨线程,需要通过
Invoke处理控件访问,避免抛出跨线程异常,示例如下:public string TextBoxContent { get => textBox1.Text; set { if (textBox1.InvokeRequired) { textBox1.Invoke(new Action(() => textBox1.Text = value)); return; } textBox1.Text = value; } } - 非特殊场景不建议直接修改控件的访问修饰符为
public,属性封装的方式可以避免控件的其他权限被意外暴露修改。
内容的提问来源于stack exchange,提问作者Kaio Patrick
相关产品推荐
相关产品推荐

