为了账号安全,请及时绑定邮箱和手机立即绑定

如何在不触发FormClosing的情况下返回到上一个表单?

如何在不触发FormClosing的情况下返回到上一个表单?

C#
冉冉说 2023-07-09 17:40:39
我有一个带有许多表单的 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#窗体
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

您可以使用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;

    }

}


查看完整回答
反对 回复 2023-07-09
?
森林海

TA贡献2011条经验 获得超2个赞

最简单的方法是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;

            }

        }

    }


查看完整回答
反对 回复 2023-07-09
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信