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