VB.NET Form öffnen

VB.NET Form öffnen
VB.NET Form öffnen

VB.NET Form öffnen

In VB.NET eine Form zu öffnen kann vor allem für Neulinge ziemlich doof laufen, jedoch dazu gleich mehr!

Eine zweite Form zu öffnen, oder allgemein eine versteckte Form wieder anzuzeigen gehört glaube ich heute zu den Standards in jeder Anwendung.

Wenn Du dir z. B. das konkrete Beispiel mit einer AdressEingabe anschauen möchtest, kannst Du auch in diesen Beitrag hier abtauchen, allerdings ist da schon viel drum herum, daher ist Dieser hier definitiv einfacher.

Wie man es nicht machen sollte!

Viele Codes die Du online finden wirst, oder schon gefunden hast, werden ungefähr so aussehen – bitte nicht:

Public Class Form1

    Private Sub btnShowSecondFormWrong_Click(sender As Object, e As EventArgs) Handles btnShowSecondFormWrong.Click
        ' DONT DO THIS!
        Form2.Show()
    End Sub

End Class

Diese besonders für Einsteiger einfache Variante, prägt sich bei vielen .NET Entwicklern am Anfang ihrer Karriere Aufgrund der simplen Handhabung ein.

Später jedoch, stoßen Sie damit irgendwann berechtigterweise auf Kritik, denn rein logisch betrachtet: Wie willst Du eine Form anzeigen, die Du nie erstellt hast?

Lasse diesen Kritiker, bzw. Besserwisser dieses Mal mich sein 🤓, denn je eher Du diesen Code-Schnipsel vergisst, desto besser für Dich und deine Nerven!

C# macht es richtig

Ein tolles Vorbild ist in diesem Beispiel C#, obwohl sich viele Funktionalitäten in den Sprachen ähneln, da Sie ja beide auf dem .NET Framework basieren, gibt es einige Unterschiede.

Unter anderem wird VB.NET deswegen auch so oft harsch kritisiert, aber gut das gehört hier jetzt nicht weiter hin..

In C# ist es zum Beispiel gar nicht erst möglich so einen Quatsch wie oben zu machen, denn der C#-Compiler fragt sich, welches Objekt er verwenden soll:

CSharp Compiler Fehler CS0120 benötigtes Objekt
CSharp Compiler Fehler CS0120 benötigtes Objekt

Warum so in VB.NET möglich?

Letztendlich könnte man sich fragen, warum das Ganze denn dann möglich ist, wenn es doch so unsauber ist.

Die Antwort liegt bei der Altlast von VB.NET, bekannt unter dem Kürzel „VB6“ und dem Namen Visual Basic Classic„.

Eine derartige Herangehensweise funktioniert, weil VB.NET an dieser Stelle eine implizite Instanz der Klasse – wenn nötig – erstellt.

Wieso viele Entwickler es trotzdem tun 😒

Immer wieder habe ich in Vergangenheit beobachtet, wie einige meiner Schüler, aber auch Entwickler aus Unternehmen, mit denen ich kooperiert habe, es trotzdem weiterhin so gemacht haben.

Was bei Schülern, sprich am Anfang stehenden Entwicklern, meiner Meinung nach noch entschuldigt werden kann, sieht bei angestellten Entwicklern denke ich anders aus.

Besonders aus VB6 kommenden „Entwicklernschwören häufig nicht von dieser Methode ab, da Sie ja so einfach ist und „..es hat ja schließlich immer funktioniert„..

Code – VB.NET Form öffnen aber richtig!

Wer sich verständlicherweise nun fragt: „Nunja, wie öffne ich denn dann eine neue Form in VB.NET?“, oder Wie zeige ich eine versteckte Form in VB.NET an?“, wir hier nun fündig.

Da es sich bei VB.NET um eine objektorientierte Sprache handelt, in der man natürlich meistens mit irgendwelchen Objekten – vorzugsweise Instanzen von Klassen – arbeitet, sieht es auch bei den Formen nicht anders aus.

Letztendlich muss man nur eine Instanz einer Form erstellen und anschließend deren Show-, bzw. ShowDialog-Methode aufrufen.

VB.NET Form öffnen

Wir nehmen also unser kleines Beispiel von vorhin und bauen es fix wie folgt um:

Public Class Form1

    Private Sub btnShowSecondForm_Click(sender As Object, e As EventArgs) Handles btnShowSecondForm.Click
        Dim instance = New Form2()
        instance.Show()
    End Sub

End Class

Achtung – Offene Formen

Beachte jedoch, dass bei mehreren Klicks, dementsprechend mehrere und somit unabhängige Instanzen der Form geöffnet werden.

Wenn Du Diese dann im zweiten Formular mit dem „Hide“-Button versteckst, bleiben Diese dennoch im Hintergrund offen – die Formen verbrauchen also Ressourcen im Hintergrund!

Um das Problem genauer darzustellen, habe ich Dir eine Debug.WriteLine-Zeile eingebaut, die dies anzeigt.

Ich denke dort liegt auch das hauptsächliche Problem von vielen Entwicklern, also das der jeweilige Entwickler noch nicht so weit ist und nicht mit dem ganzen Umfang der Materie klarkommt.

Damit meine ich die korrekte Arbeit mit verschiedenen Instanzen und das jede dieser Instanzen auch eigene Events auslösen kann, verwaltet werden möchte und auch eigene Gültigkeitsbereiche hat.

Man muss hier also darauf achten, dass Formen auch bei Bedarf wieder sauber geschlossen werden und nicht wie gezeigt im Hintergrund vor sich hin dümpeln.

Zweites Beispiel – Mit Zwischenspeicher

In diesem Teil zeige ich Dir, wie Du die Form nach Erstellung in einer formularweiten Variable/Eigenschaft cachen – also praktisch zwischenspeichern kannst.

Das ermöglicht dir den späteren Zugriff auf die Form, z. B. wie im Sample durch weitere Buttons.

Public Class Form1

    Public WithEvents CachedInstance As Form2

    Private Sub btnShowFormAndCache_Click(sender As Object, e As EventArgs) Handles btnShowFormAndCache.Click
        CachedInstance = New Form2()
        CachedInstance.Show()
    End Sub

    Private Sub btnShowCachedForm_Click(sender As Object, e As EventArgs) Handles btnShowCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Show()
        End If
    End Sub

    Private Sub btnHideCachedForm_Click(sender As Object, e As EventArgs) Handles btnHideCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Hide()
        End If
    End Sub

    Private Sub btnCloseCachedForm_Click(sender As Object, e As EventArgs) Handles btnCloseCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Close()
        End If
    End Sub

End Class

Kompletter Code – VB.NET Form öffnen

Public Class Form1

    Private Sub btnShowSecondFormWrong_Click(sender As Object, e As EventArgs) Handles btnShowSecondFormWrong.Click
        Form2.Show()
    End Sub

    Private Sub btnShowSecondForm_Click(sender As Object, e As EventArgs) Handles btnShowSecondForm.Click
        Dim instance = New Form2()
        instance.Show()
    End Sub


    Public WithEvents CachedInstance As Form2

    Private Sub btnShowFormAndCache_Click(sender As Object, e As EventArgs) Handles btnShowFormAndCache.Click
        CachedInstance = New Form2()
        CachedInstance.Show()
    End Sub

    Private Sub btnShowCachedForm_Click(sender As Object, e As EventArgs) Handles btnShowCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Show()
        End If
    End Sub
    Private Sub btnHideCachedForm_Click(sender As Object, e As EventArgs) Handles btnHideCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Hide()
        End If
    End Sub

    Private Sub btnCloseCachedForm_Click(sender As Object, e As EventArgs) Handles btnCloseCachedForm.Click
        If CachedInstance IsNot Nothing Then
            CachedInstance.Close()
        End If
    End Sub

End Class

Public Class Form2

    Private Sub btnHide_Click(sender As Object, e As EventArgs) Handles btnHide.Click
        Hide()
        Debug.WriteLine(Application.OpenForms.Count, "Open")
    End Sub

    Private Sub btnClose_Click(sender As Object, e As EventArgs) Handles btnClose.Click
        Close()
    End Sub

End Class

Downloads

Schreibe einen Kommentar

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