子窗体操作完成后通知父窗体刷新
你给出的示例已经是一个标准的事件回调写法,思路完全正确。下面我帮你把这个知识点梳理完整,并补充一些常见变体和注意事项。

核心思路
子窗体不关心父窗体是谁、怎么刷新,只负责在合适的时机触发事件;父窗体订阅该事件,在回调方法中执行自己的刷新逻辑。这样两个窗体之间解耦,方便维护。
完整示例(基于你的代码)
子窗体 FormAddUser
public partial class FormAddUser : Form
{
// 定义委托和事件
public delegate void RefreshUserDelegate(string username);
public event RefreshUserDelegate RefreshEvent;
private string v;
public FormAddUser()
{
InitializeComponent();
}
public FormAddUser(string v)
{
this.v = v;
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
// 执行添加用户的逻辑(示例)
// ... 保存到数据库等
// 触发事件,通知父窗体
RefreshEvent?.Invoke("dddd");
// 如果是模态窗体,可以顺便设置 DialogResult
this.DialogResult = DialogResult.OK;
this.Close();
}
}
父窗体 Form1
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
FormAddUser fa = new FormAddUser("foxdevelop.com");
fa.RefreshEvent += Fa_RefreshEvent; // 订阅事件
fa.ShowDialog();
}
private void Fa_RefreshEvent(string username)
{
// 在这里刷新父窗体中的用户列表/数据
this.Text = username;
// 比如:LoadUserList(); 重新查询数据库并绑定到 DataGridView
}
}
简化写法(使用内置 Action/Func,无需自定义委托)
C# 已内置泛型委托,实际开发中不需要自己定义 delegate:
// 子窗体中
public event Action<string> RefreshEvent;
// 触发
RefreshEvent?.Invoke("新用户名");Code language: PHP (php)
父窗体订阅方式不变:
fa.RefreshEvent += (username) =>
{
this.Text = username;
LoadUserList(); // 刷新用户列表
};Code language: JavaScript (javascript)
另一种常见方式:通过 DialogResult 判断
如果子窗体只是“添加/编辑”这种一次性操作,用 DialogResult 更简洁:
子窗体
private void btnSave_Click(object sender, EventArgs e)
{
// 保存逻辑...
this.DialogResult = DialogResult.OK;
this.Close();
}Code language: JavaScript (javascript)
父窗体
private void button1_Click(object sender, EventArgs e)
{
FormAddUser fa = new FormAddUser();
if (fa.ShowDialog() == DialogResult.OK)
{
// 子窗体保存成功,刷新数据
LoadUserList();
}
}Code language: JavaScript (javascript)
| 对比 | 事件回调 | DialogResult |
|---|---|---|
| 适用场景 | 子窗体需多次通知父窗体 | 只需知道“成功/取消” |
| 灵活度 | 高,可传任意参数 | 低,只能返回 OK/Cancel 等 |
| 解耦程度 | 高 | 一般 |
| 推荐度 | ✅ 操作复杂时 | ✅ 简单增删改 |
Previous: 窗体基础操作
Next: MDI 多文档界面容器窗体