Frage c # WinForms-Formular wird immer noch geschlossen, nachdem e.Cancel = true im Form_FormClosing-Ereignis festgelegt wurde


Dies ist der betreffende Code:

    private void FormAccounting_FormClosing(object sender, FormClosingEventArgs e)
    {
        Properties.Settings.Default.FormAccountingLocation = this.Location;
        Properties.Settings.Default.Save();
        if (IsEditing)
        {
            MessageBox.Show("Please save or cancel open transactions before closing the accounting window.", "Open Transactions", MessageBoxButtons.OK, MessageBoxIcon.Information);
            e.Cancel = true;
        }
    }

Ich habe Breakpoints hinzugefügt e.Cancel = true; Linie, um sicherzustellen, dass es ausgeführt wird.

Das Formular wird sofort nach dem Klicken auf Ok geschlossen.

Hier ist der Code, der FormAccounting aufruft:

    private void buttonAccounts_Click(object sender, EventArgs e)
    {
        FormAccounting NewFormAccounting = new FormAccounting();
        NewFormAccounting.Show();
    }

5
2017-08-17 11:14


Ursprung


Antworten:


Das Abbrechen des Ereignisses zum Schließen des Formulars verhindert Folgendes:

  1. Benutzer, der das Formular schließt
  2. Application.Exit vom Beenden der Anwendung
  3. Code vom Aufruf von Form.Close auf dem Formular

Aber es funktioniert nicht, um Folgendes zu verhindern:

  1. Hauptformular des Benutzers, der die Anwendung schließt
  2. Code, der Form.Dispose auf dem Formular aufruft
  3. Code ruft Form.Close im Hauptfenster der Anwendung auf

Die letzten 3 Fälle lösen nicht einmal das close-Ereignis des Formulars auf dem Nicht-Hauptformular aus, sodass das Formular ohne eine Möglichkeit zum Abbrechen des Formulars verschwindet. Vielleicht bewirkt Ihre Anwendung, dass das Formular zuerst auf eine der ersten drei Arten schließt, was das Ereignis auslöst, und dann auf eine der zweiten drei Arten (oder etwas Ähnliches), was das Ereignis nicht auslöst und das Formular trotzdem geschlossen macht .

Bearbeiten: Fügen Sie diese Funktion Ihrem Formularcode hinzu, und Sie können im Debugger überprüfen, wie der Aufruf-Stack aussieht, wenn Ihr Fenster geschlossen wird, damit Sie sehen können, was es tatsächlich verursacht:

  protected override void DestroyHandle()
  {
     System.Diagnostics.Debugger.Break();
     base.DestroyHandle();
  }

13
2017-08-17 11:38