Frage

Ich versuche, eine bestimmte Form mit einer TreeView -Steuerung zu zeigen, deren Knoten ihre haben tag Wert auf eine Instanz des Formulars festgelegt, das ich zeigen muss. Der Code, den ich in der DoubleClick -Veranstaltung habe, funktioniert zum ersten Mal großartig, aber danach erhalte ich eine Objektausnahme. Wie Sie sehen können, habe ich versucht, das Tag zurückzusetzen, aber das hat nicht funktioniert. Gibt es eine Möglichkeit, das Formular mehr als einmal zu zeigen, ohne eine Switch -Anweisung zu durchlaufen, wenn die Ausnahme eingeht und das Tag auf die richtige Form des Formulars zurücksetzt? Ich hätte gerne etwas Schöneres, wie ich die Form zeige.

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fm2 As New Form2()
        Dim fm3 As New Form3()
        TreeView1.Nodes(0).Tag = fm2
        TreeView1.Nodes(1).Tag = fm3
    End Sub

    Private Sub TreeView1_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles TreeView1.DoubleClick
        Try
            CType(TreeView1.SelectedNode.Tag, Form).Show()
        Catch odex As ObjectDisposedException
            TreeView1.SelectedNode.Tag = New Form()
            TreeView1_DoubleClick(sender, e)
        Catch nrex As NullReferenceException
            'No node selected, do nothing.  
        End Try
    End Sub
End Class
War es hilfreich?

Lösung

Ihr Problem hier ist, wenn der Benutzer das Formular schließt, das Objekt entsorgt wurde.

Es gibt einige Möglichkeiten, wie Sie damit umgehen können, einige eleganter als die anderen.

  1. Fügen Sie einen Handler für formx_closed () hinzu. Zu diesem Zeitpunkt können Sie die Tag -Referenz zurücksetzen
  2. Sie können zu einem "Anzeigendialog" -Prozess wechseln und dann zurücksetzen, bevor Ihre DoubleClick () -Methode endet

Es hängt wirklich davon ab, was diese Formen tun. Normalerweise würde ich sehen, wie Ihre DoubleClick -Methode eine Suche durchführt und dann die Instanz erstellt.

Suchbeispiel

Wie in den Kommentaren angefordert, würde ich, wenn ich dies auf eine andere Art und Weise tun würde, einen Aufzählungswert oder sogar einen einfachen Ganzzahl -Schlüsselwert für das Tag verwenden. Dann würde ich so etwas wie Folgendes erstellen, um es zu zeigen.

Select Case myTag
    Case 1
        Dim formInstance As New Form1()
        formInstance.Show()
    Case Else
        Dim formInstance As New Form2()
        formInstance.Show()
End Select

Grundsätzlich zentralisieren Sie es und starten Sie das Formular bei Bedarf. Sie können dies für ein anderes Designmuster ausschalten, wenn Sie mehr Kontrolle haben oder viele verschiedene Formyptypen haben.

Andere Tipps

Das Formular wird entsorgt, wenn es vom Benutzer geschlossen wird. Eine Möglichkeit besteht darin, das Schließereignis des Formulars ANS zu verbergen, anstatt zu schließen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top