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

如何实现User Control多窗体复用下的TextBox文本动态回传父窗体

解决方案

方案一:自定义事件(推荐,符合.NET控件设计规范)

该方案完全解耦UserControl和父窗体,不需要控件感知父窗体的任何类型信息,适配所有复用场景。

修改UserControl代码

删除原有硬编码转换父窗体的逻辑,新增对外暴露的文本变化事件:

public partial class MyUserControl : UserControl
{
    // 对外暴露的文本变化事件,参数为最新的文本内容
    public event EventHandler<string> CallsignTextChanged;

    public string pub_callsign
    {
        get { return textBox1.Text; }
    }

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        // 存在订阅者时触发事件,传递最新文本
        CallsignTextChanged?.Invoke(this, pub_callsign);
    }
}

父窗体订阅事件

所有需要使用该控件的窗体,只需订阅控件的CallsignTextChanged事件即可接收内容:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        // 假设窗体上的UserControl实例名为myUserControl1
        myUserControl1.CallsignTextChanged += UserControl_CallsignTextChanged;
    }

    private void UserControl_CallsignTextChanged(object sender, string newText)
    {
        txtbx_callsign.Text = newText;
    }
}

方案二:公共接口适配(兼容原有代码逻辑)

如果不想大幅修改现有实现,可以通过公共接口约束父窗体行为,避免硬编码窗体类型。

第一步:定义公共接口

public interface ICallsignReceiver
{
    string pub_callsign { set; }
}

第二步:父窗体实现接口

所有用到该控件的父窗体都实现上述接口:

public partial class Form1 : Form, ICallsignReceiver
{
    public string pub_callsign
    {
        set { txtbx_callsign.Text = value; }
    }
    // 其余窗体代码保持不变
}

第三步:修改UserControl逻辑

将父窗体转换为接口类型即可适配所有实现了该接口的父容器:

private void textBox1_TextChanged(object sender, EventArgs e)
{
    if (this.Parent is ICallsignReceiver parentReceiver)
    {
        parentReceiver.pub_callsign = pub_callsign;
    }
}

内容的提问来源于stack exchange,提问作者Dave Bishop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 13:54:04