如何实现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
相关产品推荐
相关产品推荐

