2017-08-08 151 views
1

私はC#.netでWindowsフォームアプリケーションを使用していますが、Xボタンでフォームを閉じている間にバックアップしたいと思っています。私はこのイベントが2回実行することを気づいたプログラムは、あなたがApplication.Exit()を呼んでいるForm_FormClosingイベントがC#.netで2回実行されるのはなぜですか?

private void MenuFrm_FormClosing(object sender, FormClosingEventArgs e) 
     { 
      // DialogResult dialogResult = MessageBox.Show("ایا مایل به گرفتن نسخه پشتیبان می باشید", "هشدار", MessageBoxButtons.YesNo); 
      // if (dialogResult == DialogResult.Yes && !closefrm) 
      try 
      { 
       DialogResult dialogResult = MessageBox.Show("آیا مایل به خروج از نرم افزار میباشید؟", "خروج", MessageBoxButtons.YesNo); 
       if (dialogResult == DialogResult.Yes) 
       { 
        SaveFileDialog f = new SaveFileDialog(); 
        f.InitialDirectory = "D:\\"; 
        f.Title = "HoghooghDastmozdBackup"; 
        if (Directory.Exists("E:\\MobtakeranSoftBackup\\")) 
        { 
         f.FileName = "E:\\MobtakeranSoftBackup\\" + getPersianDate() + ".BAK"; 
         f.FilterIndex = 1; 
         f.OverwritePrompt = true; 
         f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*"; 
         SqlConnection sqlconn = new SqlConnection(DBsetting.Connstring); 
         SqlCommand sqlcmd = new SqlCommand("BACKUP DATABASE HoghooghDastmozd TO DISK [email protected]", sqlconn); 
         sqlcmd.Parameters.AddWithValue("@n", f.FileName); 
         sqlconn.Open(); 
         sqlcmd.ExecuteNonQuery(); 
         sqlconn.Close(); 
         Application.Exit(); 
        } 
        else 
        { 
         Directory.CreateDirectory("E:\\MobtakeranSoftBackup\\"); 
         f.FileName = "E:\\MobtakeranSoftBackup\\" + getPersianDate() + ".BAK"; 
         f.FilterIndex = 1; 
         f.OverwritePrompt = true; 
         f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*"; 
         SqlConnection sqlconn = new SqlConnection(DBsetting.Connstring); 
         SqlCommand sqlcmd = new SqlCommand("BACKUP DATABASE HoghooghDastmozd TO DISK [email protected]", sqlconn); 
         sqlcmd.Parameters.AddWithValue("@n", f.FileName); 
         sqlconn.Open(); 
         sqlcmd.ExecuteNonQuery(); 
         sqlconn.Close(); 
         Application.Exit(); 
        } 
       } 
       else 
       { 
        e.Cancel = true; 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       Application.Exit(); 
      } 


     } 
+0

"MenuFrm_FormClosing"のプロジェクトを検索する2つのイベントハンドラがないことを確認してください。 FormClosingEventArgsのCloseReasonもチェックしてください。これは、Windowsのシャットダウン時にも発生します。 – stuartd

答えて

0

この問題を解決するために私を助けてください。これは、フォームが完全に閉じられる前に行われます。まだ開いています。したがって、新しいCloseオペレーションがトリガされ、これには第2のForm_Closingイベントが含まれます。 2つ目のイベントを処理できるようになると、最初のイベントは終了し、フォームは完全に閉じられますので、そこで停止します(イベントは2回だけ発生します)。

これを調整するには、ブール値をクラスに追加します。デフォルトはfalseです。メソッドの先頭でfalseであることを確認し、メソッドの最後にtrueを設定します。しかし、それは実際の問題にパッチを当てているだけです...あなたはform_closingイベントであまりにも多くをやっています。 Application.Exit()コールはForm_Closedに属しますが、通常は1回だけ発生します。


私がここにいる間、私はこのコードを指摘したい:

sqlconn.Open(); 
sqlcmd.ExecuteNonQuery(); 
sqlconn.Close(); 

これは貧しい人々の練習です。 .Close() SqlConnectionオブジェクトの呼び出しは常にfinallyブロック(usingブロック経由で実現する最も簡単な方法)である必要があります。このケースでは、アプリケーションはとにかく終了しようとしているのでおそらく大丈夫ですが、この方法でクエリを実行するのは良い習慣ではなく、同じミスがプログラム内の他の場所で行われたかどうかは疑問です。私はなぜあなたがここでたくさんのコードを繰り返しているのだろうと思っています。

Directory.CreateDirectory("E:\\MobtakeranSoftBackup\\"); //it's good to just call this, even if the directory already exists. 
f.FileName = System.IO.Path.Combine(@"E:\MobtakeranSoftBackup", getPersianDate() + ".BAK"); 
f.FilterIndex = 1; 
f.OverwritePrompt = true; 
f.Filter = @"SQL Backup files (*.BAK) |*.BAK|All files(*.*) |*.*"; 
using (var sqlconn = new SqlConnection(DBsetting.Connstring)) 
using (var sqlcmd = new SqlCommand("BACKUP DATABASE HoghooghDastmozd TO DISK [email protected]", sqlconn)) 
{ 
    sqlcmd.Parameters.AddWithValue("@n", f.FileName); 
     sqlconn.Open(); 
     sqlcmd.ExecuteNonQuery(); 
} 
Application.Exit();     
+0

Joelあなたのコードはうまく機能しませんでした。私のコードのように働きます。 – ssss

+0

水平線より上の部分のみがあなたの質問に対応しています。残りの部分は、コード内のいくつかの明白でない練習を指摘しています。 –

関連する問題