Hallo,
das Shown Ereignis wird nur dann nicht ausgelöst, wenn im Load Ereignis ein Fehler aufgetreten ist.
Wenn du das Projekt mit Debugger startest, wird bei einem Fehler im Load Ereignis, das Programm nicht unterbrochen. Fehler werden nur im Ausgabefenster angezeigt. Nachfolgender Code wird nicht ausgeführt und auch das Shown Ereignis wird nicht ausgelöst. Wenn du es ohne Debugger startest, wird das Programm unterbrochen und der Fehler gemeldet.
Die Ursache für einen Fehler kann eine öffentliche Variable sein, die bereits verwurfen wurde.
Beim Öffnen einer Form mit Show oder ShowDialog wird zuerst eine Instanz der Form erstellt, die Sub New durchlaufen, die Steuerelemente erstellt, dann das Load Ereignis aufgerufen und dann das Shown Ereignis.
Wird die Form geschlossen, mit Close oder durch Klick auf das Schließsymbol, so wird die Instanz der Form verworfen, ebenfalls alle Steuerelemente und alle öffentlichen Variablen.
Wird die Form nur ausgeblendet mit Visible=False oder Hide() so bleibt alles erhalten.
Angenommen Form2 beinhaltet diesen Code:
Public Class Form2
Public frm As Form
Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Label1.Text = frm.Text
End Sub
End Class Das Label zeigt den Titeltext der übergebenen Form (frm) an.
Wird nun in Form1 der Variable "frm" eine Form zugewiesen, so wird eine Instanz der Form2 erstellt, also Sub New durchlaufen.
Load und Shown werden erst aufgerufen, wenn die Form angezeigt wird.
Beispiel:
Beim Klick auf einen Button in Form1 wird dies aufgerufen:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click
Form2.frm = Me
Form2.Show()
End Sub Dies ist völlig korrekt und löst keinen Fehler aus.
Wird nun die Form2 geschlossen und erneut geöffnet tritt ein Fehler auf, da die Variable "frm" in Form2 nun Nothing ist.
Form2.frm = Me
Form2.Show()
Form2.Close()
Form2.Show() 'Hier Fehler im Load-Ereignis! So ist es Richtig:
Form2.frm = Me
Form2.Show()
Form2.Close()
Form2.frm = Me
Form2.Show() Vor dem Öffnen müssen also öffentliche Variablen erneut zugewiesen werden. Gleiches gilt für Zugriffe auf Steuerelemente.
Man kann dies sehr gut Testen, wenn man bei New, Load und Shown Console.WriteLine("...") einfügt. |