2017-06-17 8 views
1

私はOnFormClosingのオーバーライドを定義した単純なWinFormアプリケーションを持っています。終了確認を求めて、SQL接続を閉じることができます。私は二度ポップアップし、「本当に-終了」-dialogフォームを閉じたときに残念なことに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

私のコードで他の問題があり、問題が修正されました。本当に終了するダイアログは、私がどこから呼び出しても、2回ポップアップします。 – farosch

+0

コールスタックを読み取る方法はあまりよく分かりませんが、Application.exit()メソッドから2回目に呼び出されると思います。 – 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

関連する問題