2017-08-08 95 views
1

我在C#.net中有一個windows窗體應用程序,我想通過X按鈕關閉窗體時備份所以我在代碼下面寫下了這個動作。但是當我運行程序我注意到這個事件執行2次請幫我解決這個問題爲什麼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」。您可能還想檢查FormClosingEventArgs的CloseReason,因爲這在Windows關閉時也會觸發。 – stuartd

回答

0

你叫Application.Exit()。這是在表格完全關閉之前完成的......它仍然是開放的。因此,觸發了一個新的操作,其中涉及第二個事件。當你能夠處理第二個事件時,第一個事件已經完成,表單完全關閉,所以它停在那裏(最終事件觸發兩次,而不是更多)。

您可以通過向類添加一個布爾值來調整它的默認值爲false,檢查它在方法頂部是否爲false,並在方法結束時將其設置爲true。但這只是修補真正的問題......你在form_closing事件中做得太多了。呼叫Application.Exit()屬於Form_Closed,通常只會觸發一次。


雖然我在這裏,我想指出這樣的代碼:

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

只有水平線上方的部分可以解決您的問題。其他人在代碼中指出了一些明顯不良的做法。 –