2017-08-08 2 views
1

Ich habe eine Windows-Formularanwendung in C# .net und ich möchte beim Schließen des Formulars durch X-Taste sichern So schrieb ich unten Code, um diese Aktion zu tun, aber wenn ich die Programm bemerkte ich, dass dieses Ereignis 2 mal ausführen Bitte helfen Sie mir dieses Problem Application.Exit()Warum Form_FormClosing Ereignis 2 mal in C# ausführen .net

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

sicher, dass Sie nicht zwei Event-Handler verdrahtet bekommen haben - die Suche Ihr Projekt für „MenuFrm_FormClosing“. Möglicherweise möchten Sie auch die CloseReason von FormClosingEventArgs überprüfen, da diese auch ausgelöst wird, wenn Windows heruntergefahren wird. – stuartd

Antwort

0

Sie rufen zu lösen. Dies geschieht, bevor das Formular vollständig geschlossen wurde ... es ist noch offen. Somit wird eine neue Close Operation ausgelöst, die ein zweites Form_Closing Ereignis beinhaltet. Wenn Sie das zweite Ereignis verarbeiten können, ist das erste Ereignis beendet und das Formular ist vollständig geschlossen. Es bleibt also dort stehen (am Ende wird das Ereignis genau zweimal ausgelöst und nicht mehr).

Sie können dies anpassen, indem Sie der Klasse einen Booleschen Wert als Standardwerte auf false setzen, am oberen Rand der Methode auf false prüfen und am Ende der Methode auf true setzen. Aber das ist nur das wahre Problem zu beheben ... Sie tun zu viel im form_closing-Ereignis. Der Application.Exit() Anruf gehört in Form_Closed, die normalerweise nur einmal ausgelöst werden.


Während ich hier bin, möchte ich diesen Code hinweisen:

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

Dies ist eine schlechte Praxis. Der Aufruf .Close() für ein SqlConnection-Objekt sollte immer in einem finally Block sein (der einfachste Weg, um dies zu erreichen ist über einen using Block). In diesem Fall sind Sie wahrscheinlich in Ordnung, weil die Anwendung sowieso bald beendet wird, aber es ist einfach keine gute Angewohnheit, Abfragen auf diese Weise auszuführen, und man fragt sich, ob der gleiche Fehler an anderer Stelle im Programm gemacht wird. Ich frage mich auch, warum du hier so viel Code wiederholst. Das ganze Abschnitt kann auf diese reduziert werden:

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 Ihr Code hat nicht gut funktioniert. Es funktioniert wie mein Code. Es läuft doppelte Zeit beim Schließen der App. – ssss

+0

Nur der Teil oberhalb der horizontalen Linie adressiert Ihre Frage. Der Rest weist auf einige offensichtlich schlechte Praktiken im Code hin. –

Verwandte Themen