如何在不触发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 应该导航回上一个表单,而不显示对话框消息。我怎样才能实现这个目标?因为现在单击“返回”按钮后也会显示关闭对话框。


C#窗体


冉冉说
浏览 211回答 2
2回答

白板的微信

您可以使用FormClosingEventArgs.CloseReason 属性来确定是否显示 MessageBox。设置DialogResult模态表单的属性是我知道的唯一一次将CloseReason是CloseReason.None。调用Form.Close或单击“X”按钮将显示一个CloseReasonof CloseReason.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;    }}

森林海

最简单的方法是this.Hide();在第二种形式中使用来隐藏它:   private void ButtonReturn_Click(object sender, EventArgs e)    {        this.Hide();    }但是,每次单击第一个 Form 中的 Button2_Click 事件时,都会启动一个新的 Form2。如果您希望第二个表单保持不变/保留文本框中的值等,您应该在按钮单击事件之外定义表单,并仅在尚未使用时实例化它。像这样的东西:     Form2 form2;    private void Button2_Click(object sender, EventArgs e)    {        if(form2 == null) { form2 = new Form2();}        this.Hide();        form2.ShowDialog();        this.Show();    }编辑: 为了防止触发关闭事件,您可以定义一个布尔值来检查是否按下了返回按钮。然后每次使用 Form_Activated 再次打开表单时重置该值:    bool showClosingEventMessage = true;    private void button1_Click(object sender, EventArgs e)    {        showClosingEventMessage = false;        this.Hide();    }    private void Form2_Activated(object sender, EventArgs e)    {        showClosingEventMessage = true;    }    private void Form2_FormClosing(object sender, FormClosingEventArgs e)    {        if (showClosingEventMessage)        {            DialogResult result = MessageBox.Show("Sure?", "Close", MessageBoxButtons.OKCancel, MessageBoxIcon.Information);            if (result.Equals(DialogResult.OK))            {                Environment.Exit(0);            }            else            {                e.Cancel = true;            }        }    }
打开App,查看更多内容
随时随地看视频慕课网APP