VB.NET Form Close Event

Inhaltsverzeichnis
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:

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 Close–Handling 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

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 „AskForCloseConfirmation“ auf.
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