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

Windows应用主窗体关闭时子窗体未触发secondForm_FormClosing事件求助

解决主窗体关闭时子窗体FormClosing事件不触发的问题

问题原因

主窗体关闭时,.NET框架默认会调用Environment.Exit()终止整个应用进程,子窗体被强制销毁,不会走正常的关闭流程,因此FormClosing事件不会被触发。

具体解决方案

方案1:重写主窗体的OnClosing方法,手动关闭子窗体

在主窗体代码中重写OnClosing方法,遍历所有打开的子窗体并逐个调用Close(),确保每个子窗体触发自身的FormClosing事件:

protected override void OnClosing(CancelEventArgs e)
{
    // 遍历所有打开的窗体,跳过主窗体本身
    foreach (Form form in Application.OpenForms)
    {
        if (form != this)
        {
            form.Close();
        }
    }
    base.OnClosing(e);
}

方案2:在主窗体FormClosing事件中处理子窗体关闭

通过判断主窗体的关闭原因,先手动关闭子窗体再完成主窗体的关闭流程:

private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        // 仅关闭指定类型的子窗体,遍历前转成List避免集合修改异常
        foreach (Form form in Application.OpenForms.OfType<SecondForm>().ToList())
        {
            form.Close();
        }
    }
}

方案3:为子窗体设置Owner属性(配合前两种方案使用)

打开子窗体时指定其Owner为主窗体,让子窗体的生命周期和主窗体关联更规范:

SecondForm secondForm = new SecondForm();
secondForm.Owner = this;
secondForm.Show();

注意事项

  • 遍历子窗体时需调用ToList(),避免遍历过程中集合元素变化引发异常。
  • 如果子窗体的FormClosing事件中有取消关闭的逻辑(如e.Cancel = true),需在主窗体关闭时添加对应处理,比如弹出提示确认是否强制关闭。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 13:40:58