【问题标题】:Trigger OnFormClosing() from MenuItem从 MenuItem 触发 OnFormClosing()
【发布时间】:2017-06-17 11:16:50
【问题描述】:

我有一个简单的 WinForm 应用程序,我在其中定义了 OnFormClosing 的覆盖,以便能够要求退出确认并关闭 sql 连接。 它看起来像这样:

protected override void OnFormClosing(FormClosingEventArgs e)
    {
        switch (MessageBox.Show(this, "Really quit " + Application.ProductName + "?",
                     Application.ProductName, MessageBoxButtons.YesNo,
                     MessageBoxIcon.Exclamation))
        {
            case DialogResult.Yes:
                con.Close();
                Debug.WriteLine("Connection Closed");
                Debug.WriteLine("Exiting Application");
                Application.Exit();
                break;
            default:
                break;
        }
    }

不幸的是,当我关闭表单时,“真正退出”对话框会弹出两次。 为什么会这样?

【问题讨论】:

  • 在 OnFormClosing() 中放置一个断点,然后单击第一个 X 按钮,然后单击退出菜单以检查两个调用的调用堆栈,并查看对 OnFormClosing() 的所有调用(哪些方法) ) 方法来了..
  • 我的代码中存在另一个问题,已解决问题。无论我从哪里调用,really-quit-dialog 都会弹出两次。
  • 我不太确定如何读取调用堆栈,但我认为第二次从 Application.exit() 方法调用它
  • 表单关闭事件处理程序中有一个FormClosingEventArgs e参数,在'Application.Exit()'行之前设置e.Cancel = false并验证消息框只出现一次。您还可以在调试模式下检查 e.CloseReason 属性以获取指示表单关闭原因的值。
  • 另外,我认为如果你设置e.Cancel = false;,应该不需要写Application.Exit()。请验证..

标签: c# winforms formclosing


【解决方案1】:

使用事件而不是覆盖:

using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1 ()
        {
            InitializeComponent ();
        }

        private void Form1_FormClosing (object sender, FormClosingEventArgs e)
        {
            var result = MessageBox.Show ("My App", "Really quit?", MessageBoxButtons.YesNo);

            if (result == DialogResult.Yes)
            {
                // close connection
            }
            else
            {
                e.Cancel = true;
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多