子窗体操作完成后通知父窗体刷新

子窗体操作完成后通知父窗体刷新

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


核心思路

子窗体不关心父窗体是谁、怎么刷新,只负责在合适的时机触发事件;父窗体订阅该事件,在回调方法中执行自己的刷新逻辑。这样两个窗体之间解耦,方便维护。


完整示例(基于你的代码)

子窗体 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 等
解耦程度高一般
推荐度✅ 操作复杂时✅ 简单增删改

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注