C# WinForms如何从另一窗体获取e.cancel属性实现多窗体同步关闭
问题根源
现有代码存在两个核心问题:
- LoginForm的FormClosing逻辑存在语法错误,
if(f==DialogResult.Yes)完全不成立,f是MainForm实例,无法和DialogResult枚举直接比较 - 调用
Application.Exit()时会默认触发所有已打开窗体的FormClosing事件,默认会走MainForm的确认弹窗逻辑,无需强行修改外部的e.Cancel属性,只要给MainForm加一个跳过确认的标记位即可实现需求
实现方案
第一步:修改MainForm代码
首先给MainForm添加公共标记位,同时修改FormClosing事件逻辑:
// 定义在MainForm的类成员区域 public bool SkipCloseConfirm { get; set; } = false; private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { // 标记为跳过确认时直接允许关闭,无需弹确认框 if (SkipCloseConfirm) { e.Cancel = false; return; } // 原有正常关闭的确认逻辑保留 var d = MessageBox.Show("Exit Program","Confirm",MessageBoxButtons.YesNo,MessageBoxIcon.Question); if(d == DialogResult.Yes) { e.Cancel = false; } else { e.Cancel = true; } }
第二步:修改LoginForm的FormClosing逻辑
需要触发全局退出时,先设置MainForm的跳过确认标记,再调用Application.Exit即可:
private void LoginForm_FormClosing(object sender, FormClosingEventArgs e) { var mainForm = (MainForm)Application.OpenForms["MainForm"]; if(mainForm != null) { // 此处可根据你实际的业务逻辑判断是否需要触发全局退出 mainForm.SkipCloseConfirm = true; Application.Exit(); } }
补充说明
- 如果你不需要跳过MainForm的关闭确认,只是要把LoginForm的关闭和MainForm绑定,直接在LoginForm的FormClosing事件里调用
mainForm.Close()即可,会自动触发MainForm的正常关闭确认流程 - 注意WinForm里的弹窗按钮枚举是
MessageBoxButtons,你原有代码里的MessageBoxButton是WPF的枚举,不要混用
内容的提问来源于stack exchange,提问作者Akagami Shanks
相关产品推荐
相关产品推荐

