2017-06-17 42 views
1

我有一个简单的WinForm应用程序,我已经为OnFormClosing定义了覆盖,以便能够请求退出确认并关闭sql连接。 它看起来像这样:从MenuItem触发OnFormClosing()

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; 
     } 
    } 

不幸的是,当我关闭表单中的“真,戒” - 对话两次弹出。 这是为什么呢?

+1

将断点在OnFormClosing(),然后点击第一个X键和后来退出菜单,检查这两个调用的调用堆栈,并从所有(这方法参见( s))OnFormClosing()方法的调用即将到来。 – VS1

+0

我的代码中存在另一个问题,修复了这个问题。无论我在哪里调用它,真正退出对话框都会弹出两次。 – farosch

+0

我不太清楚如何读取调用堆栈,但我认为第二次从Application.exit()方法调用 – farosch

回答

2

使用事件,而不是覆盖:

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; 
      } 
     } 
    } 
} 
+0

这实际上使它更具可读性!谢谢 – farosch