VB.NET Form Close Event

VB.NET Form Close Event
VB.NET Form Close Event

VB.NET Form Close Event

Du möchtest wissen, was das VB.NET Form Close Event ist, oder wenn Du es bereits weißt, darauf reagieren, bzw. damit arbeiten?

Eventuell möchtest Du einen Nutzer deiner Anwendung auch daran hindern können, eine Form zu schließen?

Wie das funktioniert und wie Du einen passenden Ereignishandler auch z. B. dynamisch verknüpfst lernst Du in diesem Beitrag.

Alternativ, bzw. ergänzend sind für dich vielleicht auch noch folgende Beiträge interessant: Form öffnen, InputBox Beispiel, oder Input Dialog

Beispielhafte Einsatzmöglichkeit

Ich denke ein Fenster wie das Folgende hat jeder einmal gesehen, egal ob in der Rolle als Anwender, oder als Entwickler:

VB.NET Form Close Event Bestätigungsfenster
VB.NET Form Close Event Bestätigungsfenster

Obwohl ich solche Fenster persönlich irgendwie für Quatsch halte, finden viele Personen einen echten Nutzen.

Ich selbst denke: „Naja wenn ich schon auf das X etc. klicke, dann möchte ich wohl, dass sich das Fenster schließt„.

Viele Leute werden jetzt aufschreien und sagen: „Ja, aber was wenn ich da aus Versehen drankomme, etc.“.

Wie immer gilt natürlich auch hier, dass es jeder selbst wissen muss, was er für Erwartungen an sein eigenes Programm hat und auch von anderen Programmen erwartet.

Code

VB.NET Form Close Event

Schauen wir uns einfach mal einen Beispiel-Ereignishandler für das Closing bzw. Close-Event an:

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    ' do something when form IS closing
End Sub

Wie ich schon versuche mit dem Kommentar klar zu machen, ist die Form in diesem Moment dabei sich zu schließen, jedoch noch nicht geschlossen.

Das hat natürlich den Vorteil, bzw. den Sinn, dass wir in den Schließungs-Prozess noch eingreifen und so unseren eigenen Code verarbeiten können.

In das CloseHandling der Form einzugreifen könnte eventuell so aussehen:

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    e.Cancel = True
End Sub
VB.NET Form Closing Ereignis abbrechen

Ist dann nur in dem Fall relativ doof für den Anwender, denn jetzt bekommt er das Formular nicht mehr zu, also sollten wir ein wenig Logik hinzufügen.

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    If MessageBox.Show("Close confirmation", "Do you really want to close the application?", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
        e.Cancel = True
    End If
End Sub

Wer mich allerdings kennt weiß, dass ich den Code unmöglich so stehen lassen würde..

Viel zu breit dargestellt und unübersichtlich, nichts zusammengefasst und und und, also Refactoring to the rescue:

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
    AskForCloseConfirmation(e)
End Sub

Private Sub AskForCloseConfirmation(e As FormClosingEventArgs)
    Dim question = "Do you really want to close the application?"
    Dim title = "Close confirmation"
    Dim questionResult = MessageBox.Show(question, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    Dim hasBeenCancelled = questionResult = DialogResult.No
    e.Cancel = hasBeenCancelled
End Sub

Wir rufen nun in dem „Form Closing„-Ereignishandler eine passend bezeichnete Methode namens „AskForCloseConfirmationauf.

Das hat natürlich einerseits den Vorteil, dass Sie beschreibt was Sie tun soll – wie es jede Methode tun sollte –, aber viel mehr, dass man den Aufruf der Methode durch die Kapselung bei anderen Bedingungen einfacher gestalten könnte.

Statt den Code-Text kilometerweit nach rechts zu drängen, sehen wir nun in einem Blick, welche Variablen verfügbar sind, was Diese sollen und vor allem was Ihnen zugewiesen wurde.

VB.NET Form Closed Event

Alternativ können wir uns auch noch zu einem späteren Zeitpunkt in den Lifecycle einer Form einhaken, dies wäre dann das Closed-Event.

Wie der Name und die vorherigen Erklärungen schon klar machen, ist die Form zu diesem Zeitpunkt bereits geschlossen.

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    ' so something when the form HAS BEEN closed
End Sub

Wir können in dem „Form Closed“-Handler dann auch noch eine Information namens CloseReason abrufen:

Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
    Debug.WriteLine(e.CloseReason.ToString(), "CloseReason")
End Sub

Dynamisches Beispiel mit zweiter Form

Hier zeige ich ein kleines Beispiel mit einer zweiten Form und einem dynamische verknüpften Handler.

Dafür fügen wir zwei weitere Knöpfe und ein Feld (oder Eigenschaft..) als Zwischenspeicher in die erste Form ein.

Beobachte die Ausgaben der Debug.WriteLine-Anweisung, um den Ablauf der Handler genauer im Blick zu haben und somit besser verstehen zu können.

Private WithEvents SecondForm As Form2

Private Sub btnOpenSecondForm_Click(sender As Object, e As EventArgs) Handles btnOpenSecondForm.Click
    Dim instance = New Form2()
    ' one example with addhandler
    AddHandler instance.FormClosed, AddressOf Form2_FormClosed
    SecondForm = instance
    instance.Show()
End Sub

Private Sub btnCloseSecondForm_Click(sender As Object, e As EventArgs) Handles btnCloseSecondForm.Click
    If SecondForm IsNot Nothing Then
        SecondForm.Close()
    End If
End Sub

Kompletter Code – VB.NET Form Close Event

Zum Schluss gibt es wie fast immer den ganzen Code in einem Stück:

Public Class Form1

    Private Sub btnCloseForm_Click(sender As Object, e As EventArgs) Handles btnCloseForm.Click
        Close()
    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        AskForCloseConfirmation(e)
    End Sub

    Private Sub AskForCloseConfirmation(e As FormClosingEventArgs)
        Dim question = "Do you really want to close the application?"
        Dim title = "Close confirmation"
        Dim questionResult = MessageBox.Show(question, title, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
        Dim hasBeenCancelled = questionResult = DialogResult.No
        e.Cancel = hasBeenCancelled
    End Sub

    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        Debug.WriteLine(e.CloseReason.ToString(), "CloseReason")
    End Sub

    ' second form!
    Private WithEvents SecondForm As Form2

    Private Sub btnOpenSecondForm_Click(sender As Object, e As EventArgs) Handles btnOpenSecondForm.Click
        Dim instance = New Form2()
        ' one example with addhandler
        AddHandler instance.FormClosed, AddressOf Form2_FormClosed
        SecondForm = instance
        instance.Show()
    End Sub

    Private Sub btnCloseSecondForm_Click(sender As Object, e As EventArgs) Handles btnCloseSecondForm.Click
        If SecondForm IsNot Nothing Then
            SecondForm.Close()
        End If
    End Sub

    ' one example with normal handles clause
    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles SecondForm.FormClosing
        Debug.WriteLine("Form2_FormClosing", "external handler")
    End Sub

    Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs)
        Debug.WriteLine("Form2_FormClosed", "external handler")
    End Sub


End Class

Public Class Form2

    Private Sub Form2_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing
        Debug.WriteLine("Form2_FormClosing", "internal handler")
    End Sub

    Private Sub Form2_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
        Debug.WriteLine("Form2_FormClosed", "internal handler")
    End Sub

End Class

Downloads

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.