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

WinForm关闭时如何判断触发按钮,仅在点击OK时执行关闭校验?

实现方案

你可以通过以下两种常用方式实现需求,第一种更简洁,推荐优先使用:

方案1:直接在OK按钮点击事件中处理校验(无需依赖FormClosing事件)

你之前在OK按钮点击事件中无法取消关闭,是因为默认给OK按钮设置了DialogResult.OK属性,点击后会自动触发窗体关闭。只要在校验不通过时重置DialogResult即可阻止自动关闭:

  1. 保持OK按钮的DialogResult属性为DialogResult.OK(常规配置即可)
  2. 编写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事件中统一处理关闭前逻辑,可以新增一个私有标志位判断关闭触发来源:

  1. 在窗体类内部声明标志位:
// 标记是否由点击OK按钮触发的关闭
private bool _isClosingByOk = false;
  1. 编写OK按钮点击事件,点击时修改标志位再触发关闭:
private void btnOk_Click(object sender, EventArgs e)
{
    _isClosingByOk = true;
    this.Close();
}
  1. 修改原有的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:51:04