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

C# WinForm中如何让UserControl设置另一个Form的文本框、标签值

C# WinForm 实现UserControl对其他窗体控件赋值的方案及示例

首先明确前提:默认需要被赋值的窗体为TargetForm,包含textBox1、label1两个待赋值控件。WinForm默认控件访问修饰符为private,推荐通过公共属性封装控件的赋值能力,而非直接修改控件访问权限。


方案1:通过公共属性传递窗体实例(适合简单业务场景)

该方案逻辑简单,直接让UserControl持有目标窗体的实例进行赋值操作。

  1. 首先在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();
    }
}
  1. 在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传入的标签内容";
    }
}
  1. 在两个对象的共同父容器(一般是主窗体)中给UserControl的目标实例属性赋值:
// 主窗体加载时的逻辑示例
private void MainForm_Load(object sender, EventArgs e)
{
    // 打开目标窗体
    TargetForm targetForm = new TargetForm();
    targetForm.Show();
    // 给UserControl传递目标窗体实例
    myUserControl1.TargetFormInstance = targetForm;
}

方案2:通过委托事件实现(解耦推荐,适合复杂场景)

该方案不需要UserControl持有目标窗体的引用,通过事件通知的方式完成赋值,可维护性更强。

  1. 在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("文本框赋值内容", "标签赋值内容");
    }
}
  1. 在共同父容器中订阅事件,完成赋值逻辑:
// 主窗体加载时的逻辑示例
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:00:01