WinForm关闭时如何判断触发按钮,仅在点击OK时执行关闭校验?
实现方案
你可以通过以下两种常用方式实现需求,第一种更简洁,推荐优先使用:
方案1:直接在OK按钮点击事件中处理校验(无需依赖FormClosing事件)
你之前在OK按钮点击事件中无法取消关闭,是因为默认给OK按钮设置了DialogResult.OK属性,点击后会自动触发窗体关闭。只要在校验不通过时重置DialogResult即可阻止自动关闭:
- 保持OK按钮的
DialogResult属性为DialogResult.OK(常规配置即可) - 编写OK按钮点击事件逻辑:
private void btnOk_Click(object sender, EventArgs e) { // 校验逻辑直接写在这里 if (listBoxLayers.SelectedItems.Count == 0) { _AcAp.Application.ShowAlertDialog("Please select one or more layers."); // 校验不通过时重置DialogResult,即可阻止窗体自动关闭 this.DialogResult = DialogResult.None; } }
这种方式下点击Cancel按钮、右上角关闭按钮等其他关闭路径都不会触发校验逻辑,完全符合你的需求。
方案2:通过标志位配合FormClosing事件实现
如果你确实需要在FormClosing事件中统一处理关闭前逻辑,可以新增一个私有标志位判断关闭触发来源:
- 在窗体类内部声明标志位:
// 标记是否由点击OK按钮触发的关闭 private bool _isClosingByOk = false;
- 编写OK按钮点击事件,点击时修改标志位再触发关闭:
private void btnOk_Click(object sender, EventArgs e) { _isClosingByOk = true; this.Close(); }
- 修改原有的FormClosing事件逻辑,仅当标志位为true时执行校验:
private void SaveToDXF_FormClosing(object sender, FormClosingEventArgs e) { if (_isClosingByOk) { if (listBoxLayers.SelectedItems.Count == 0) { _AcAp.Application.ShowAlertDialog("Please select one or more layers."); e.Cancel = true; // 校验失败重置标志位,避免后续操作判断异常 _isClosingByOk = false; } } }
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

