首页 > 解决方案 > 如何在不触发 FormClosing 的情况下返回上一个表单?

问题描述

我有一个包含多种表单的 winforms 应用程序。为了导航它们,我想使用一种代码:

第一种形式有这个打开新窗口:

    private void Button2_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form2 form2 = new Form2();
            form2.ShowDialog();
            this.Show();
        }

在第二种形式中,我有这个回到上一个窗口:

    private void ButtonReturn_Click(object sender, EventArgs e)
        {
            this.DialogResult = DialogResult.OK;
        }

但我也有处理关闭第二种形式的功能:

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            DialogResult result = MessageBox.Show("Sure?", "Close", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
            if (result.Equals(DialogResult.OK))
            {
                Environment.Exit(0);
            }
            else
            {
                e.Cancel = true;
            }
        }

所以我的问题如下:我想使用 ButtonReturn 返回上一个表单而不触发表单关闭功能,该功能设置为在“FormClosing”上运行。我希望它仅在按下窗口中的红色 [X] 后运行。buttonReturn 应该导航回以前的表单,而不显示对话框消息。我怎样才能做到这一点?因为现在关闭对话框也会在单击 buttonReturn 后显示。

标签: c#winforms

解决方案


您可以使用FormClosingEventArgs.CloseReason 属性来确定是否显示 MessageBox。

设置DialogResult模态表单的属性是我知道的唯一CloseReason时间CloseReason.None。调用Form.Close或单击“X”按钮将有一个CloseReasonCloseReason.UserClosing

我建议您仅在CloseReason.UserClosing条件下显示消息。这符合您声明的意图,并且还可以防止显示该消息以用于其他可能的 CloseReason。

if (e.CloseReason == CloseReason.UserClosing)
{
    DialogResult result = MessageBox.Show("Sure?", "Close", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);
    if (result.Equals(DialogResult.OK))
    {
        Environment.Exit(0);
    }
    else
    {
        e.Cancel = true;
    }
}

推荐阅读