C#通过委托实现主窗体与子窗体的双向通信
时间: 2025-08-21 16:48:09 AIGC 浏览: 14
### C# 中使用委托实现主窗体和子窗体之间双向通信
在 Windows Forms 应用程序中,通过定义委托可以轻松实现主窗体(Form1) 和子窗体(Form2) 的双向通信。这种方式允许两个窗体相互传递数据并响应事件。
#### 定义委托类型
为了建立这种联系,在项目中创建一个新的公共委托类型[^1]:
```csharp
public delegate void DataPassEventHandler(string data);
```
此委托用于封装方法签名,该方法接受一个字符串参数并将之作为消息发送给另一个对象。
#### 设置主窗体 (Form1)
主窗体负责实例化子窗体,并订阅其公开的事件以便接收来自子窗体的数据更新通知。同时为主窗体提供一种机制让子窗体能够调用它自己的特定处理逻辑函数[^2]。
```csharp
using System;
using System.Windows.Forms;
namespace WinFormsApp
{
public partial class Form1 : Form
{
private Form2 form2Instance; // 子窗体引用
public event DataPassEventHandler OnDataReceivedFromChild;
public Form1()
{
InitializeComponent();
Button btnOpenSubform = new Button { Text = "打开子窗口", Location = new Point(50, 50)};
Controls.Add(btnOpenSubform);
btnOpenSubform.Click += BtnOpenSubform_Click;
}
private void BtnOpenSubform_Click(object sender, EventArgs e)
{
form2Instance = new Form2(this); // 将当前实例传入子窗体构造器
form2Instance.FormClosed += Child_FormClosed; // 订阅子窗体关闭事件
form2Instance.Show(); // 显示子窗体
}
protected virtual void OnDataReceived(string message)
{
OnDataReceivedFromChild?.Invoke(message);
}
private void Child_FormClosed(object sender, FormClosedEventArgs e)
{
MessageBox.Show("子窗体已关闭");
}
}
}
```
#### 构建子窗体 (Form2)
子窗体需要持有指向父级(即主窗体)的一个引用,从而可以直接访问父级的方法或属性;另外还需要暴露一个自定义事件供外部监听者注册回调函数以获取内部状态变化的通知[^3]。
```csharp
using System;
using System.Windows.Forms;
namespace WinFormsApp
{
public partial class Form2 : Form
{
private readonly Form1 parentReference;
public event DataPassEventHandler SendDataToParentEvent;
public Form2(Form1 mainFormRef)
{
InitializeComponent();
this.parentReference = mainFormRef ?? throw new ArgumentNullException(nameof(mainFormRef));
TextBox txtMessage = new TextBox() { Location = new Point(50, 50), Width=200 };
Button btnSendMsgBack = new Button() { Text="返回信息到主窗体", Location=new Point(80,90) };
Controls.AddRange(new Control[] {txtMessage ,btnSendMsgBack });
btnSendMsgBack.Click += BtnSendMsgBack_Click;
}
private void BtnSendMsgBack_Click(object sender, EventArgs e)
{
string msgToSend = ((TextBox)this.Controls["txtMessage"]).Text.Trim();
if (!string.IsNullOrEmpty(msgToSend))
{
SendDataToParentEvent?.Invoke(msgToSend);
parentReference.OnDataReceived($"接收到的消息:{msgToSend}");
}
}
}
}
```
上述代码展示了如何利用委托来构建两层界面组件间的交互模式——不仅限于简单的单向命令流传输,还支持更复杂的多方向反馈循环结构设计[^4]。
阅读全文
相关推荐

















