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

Visual Studio中使用C#如何在子窗体关闭时调用父窗体的已有函数?

窗体间通信实现子窗体关闭同步更新父窗体表格的方案

效果示意图

可以实现,这是窗体间通信的常见需求,常用的实现方案有以下几种:

方案1:子窗体持有父窗体引用(实现简单)

  • 操作步骤:
    1. 在子窗体addNewUser的类中定义一个类型为父窗体Users的公共属性,示例:public Users ParentFormRef { get; set; }
    2. 父窗体创建子窗体实例时,把自身实例赋值给该属性:
    // 父窗体中打开子窗体的代码示例(WinForm/WPF通用逻辑)
    AddNewUser addForm = new AddNewUser();
    addForm.ParentFormRef = this;
    addForm.Show(); // 模态打开可改为ShowDialog()
    
    1. 为子窗体绑定关闭事件,在事件回调中调用父窗体暴露的表格更新方法:
    // 子窗体的关闭事件回调
    private void AddNewUser_FormClosed(object sender, FormClosedEventArgs e)
    {
        // 引用非空时执行更新
        ParentFormRef?.RefreshUserTable();
    }
    

注意:父窗体的RefreshUserTable更新方法需要设置为public或internal权限,确保子窗体可访问。

方案2:事件订阅(低耦合,更推荐)

  • 操作步骤:
    1. 在子窗体addNewUser中定义公开的自定义事件,在数据提交/窗体关闭前触发该事件:
    // 子窗体类内部定义事件
    public event Action UserDataChanged;
    // 子窗体提交数据或关闭的逻辑中触发事件
    private void SaveUserBtn_Click(object sender, EventArgs e)
    {
        // 新增用户数据保存逻辑...
        UserDataChanged?.Invoke();
        this.Close();
    }
    
    1. 父窗体创建子窗体实例时,订阅该事件,事件回调直接调用自身的表格更新方法:
    // 父窗体中打开子窗体的代码
    AddNewUser addForm = new AddNewUser();
    addForm.UserDataChanged += () => {
        this.RefreshUserTable();
    };
    addForm.Show();
    

该方案不需要子窗体感知父窗体的存在,模块耦合度更低,后续迭代修改时互相影响更小,是更规范的实现方式。

Web端父子组件场景对应实现

如果是Web前端的弹窗场景,逻辑和桌面端互通:

  • Vue框架:子弹窗通过$emit触发自定义事件,父组件监听事件执行更新逻辑,也可通过ref获取子组件实例调用方法
  • React框架:父组件将表格更新函数作为props传递给子弹窗组件,子弹窗关闭前调用传入的函数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:24:02