none
Name des selektierten Knoten aus einem TreeView auslesen VB2008 RRS feed

  • Frage

  • Hallo,

    Ich möchte aus einem TreeView den Namen des Knotens auslesen.
    Dabei gehe ich wie folgt vor:

            Me.L_FullPath_Wert.Text = Me.TV_Ordner.SelectedNode.Name

    Wenn ich das Programm starte und einen Knoten in dem TreeView-Steuerelement "TV_Ordner" anklicke erscheint immer folgende Fehlermeldung:

    Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

    Ich wies mir nicht weiter. Wer kann helfen?

    Samstag, 18. Juli 2015 15:06

Antworten

  • Du reagierst nur auf das Click-Ereignis.

    Wie ich bereits oben angedeutet habe, gibt es dafür aber andere Ergebnisse. Das Click-Ereignis wird auch ausgelöst, wenn man garnicht an der Auswhal ändernt.

    Bitte regisitrere den Eventhandler eher auf TreeView.AfterSelect

    Ferner musst du in deinem Code eine Prüfung ausführen:

    '''
    ''' Sollte der Syntax nicht stimmen, sorry. 
    ''' Habe schon lange nicht mehr mit VB gearbeitet...
    '''
    
    IF TV_Ordner.SelectedNode <> Nothing THEN ''' Es gibt einen Wert, jetzt kann man Arbeiten
        L_Knotenname.Text = TV_Ordner.SelectedNode
    END IF

    Ich hoffe, das beantwortet deinen Fragen.


    © 2015 Thomas Roskop
    Germany //  Deutschland


    Samstag, 18. Juli 2015 16:26

Alle Antworten

  • Hallo Jörg, wo hast du den Code den Eingefügt?

    Da du uns nicht geschrieben hast, ob du mit WinForms oder mit WPF arbeitest, kann ich nur allgemein antworten.

    Es gibt immer ein Ereignis welches ausgelöst wird, sobald ein Wert gewählt wurde. Bei WPF müsste es SelctionChanged sein, bei WinForms AfterSelect.

    Wenn du nun dieses Ereignis abfängst UND überprüfst, ob es einen gültigen Wert gibt, bist du auf der sicheren  Seite. Denn: Die Ereignisse werden auch geworfen, wenn die Auswahl aufgehoben wird (nichts mehr gewählt ist).

    Überprüfe einfach vorher, ob SelectedNode null ist. Wenn dies der Fall ist, brich ab. Anderfalls, kannst du mit dem Knoten arbeiten und wie in deinem Beispiel den Namen auslesen.


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Samstag, 18. Juli 2015 15:45
  • Hallo Thomas,

    ich arbeite mit Windows Forms.
    In einem Formular habe ich ein TreeView-Steuerelement angelegt "TV_Ordner".

    Dieses TreeView-Steuerelement habe ich testweise beliebig von Hand gefüllt. Das hat alles wunderbar funktioniert.

            Dim HauptKnoten As TreeNode = New TreeNode("Knoten")
            TV_Ordner.Nodes.Add(HauptKnoten)
            LastNode = HauptKnoten
    
            Dim UnterKnoten1 As TreeNode = New TreeNode("Knoten 1")
            LastNode.Nodes.Add(UnterKnoten1)
    
            Dim UnterKnoten2 As TreeNode = New TreeNode("Knoten 2")
            LastNode.Nodes.Add(UnterKnoten2)
    
            Dim UnterKnoten3 As TreeNode = New TreeNode("Knoten 3")
            LastNode.Nodes.Add(UnterKnoten3)
            LastNode = UnterKnoten3
    
            Dim UnterKnoten3_1 As TreeNode = New TreeNode("Knoten 3.1")
            LastNode.Nodes.Add(UnterKnoten3_1)
    
            Dim UnterKnoten3_2 As TreeNode = New TreeNode("Knoten 3.2")
            LastNode.Nodes.Add(UnterKnoten3_2)
    
    Nach dem Start des Programms klicke ich auf einen beliebigen Knoten. Das Ereignis "TV_Ordner_Click" wird ausgelöst. In diesem Ereignis möchte ich den Namen des Knotens auslesen und auf ein Label-Steuerelement schreiben.
        Private Sub TV_Ordner_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TV_Ordner.Click
    
            Me.L_Knotenname.Text = Me.TV_Ordner.SelectedNode.Text
    
        End Sub
    

    Dabei erscheint besagte Fehlermeldung.

    Warum soll ich eine Objektinstanz von einem Objekt anlegen, wo ich lediglich einen Wert auslesen möchte?


    Samstag, 18. Juli 2015 16:02
  • Du reagierst nur auf das Click-Ereignis.

    Wie ich bereits oben angedeutet habe, gibt es dafür aber andere Ergebnisse. Das Click-Ereignis wird auch ausgelöst, wenn man garnicht an der Auswhal ändernt.

    Bitte regisitrere den Eventhandler eher auf TreeView.AfterSelect

    Ferner musst du in deinem Code eine Prüfung ausführen:

    '''
    ''' Sollte der Syntax nicht stimmen, sorry. 
    ''' Habe schon lange nicht mehr mit VB gearbeitet...
    '''
    
    IF TV_Ordner.SelectedNode <> Nothing THEN ''' Es gibt einen Wert, jetzt kann man Arbeiten
        L_Knotenname.Text = TV_Ordner.SelectedNode
    END IF

    Ich hoffe, das beantwortet deinen Fragen.


    © 2015 Thomas Roskop
    Germany //  Deutschland


    Samstag, 18. Juli 2015 16:26
  • Hallo Thomas,

    Du hattest Recht. Ich habe das falsche Ereignis gewählt. Bei dem Ereignis "AfterSelect" funktioniert das Auslesen einwandfrei.

    Vielen Dank noch einmal!

    Samstag, 18. Juli 2015 16:39
  • Wenn dir meine Antwort geholfen hat, würdest du diese bitte mit dem Link "Als Antwort markieren" markieren.

    Dadurch sehen die anderen, dass dir schon geholfen wurde.

    Danke :D


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Samstag, 18. Juli 2015 16:51
  • Hi Jörg,
    wenn die Fehlernachricht "Objektverweis wurde nicht auf eine Objektinstanz festgelegt" kommt, dann sollte man sich die Variable anschauen, die keine Verweis enthält. In Deinem Falls kann das TV_Ordner sein, weil sie vielleicht im konkreten Kontext (Routine) nicht gefüllt wurde. Wenn "TV_Ordner" einen Verweis enthält, dann wird kein SelectedNode zur Verfügung stehen. Ursache dafür kann sein, dass Du im falschen Ereignis die Anweisung nutzt.

    --
    Viele Grüsse
    Peter Fleischer (MVP, Partner)
    Meine Homepage mit Tipps und Tricks

    Samstag, 18. Juli 2015 18:53
  • Hallo Thomas,

    ''' Sollte der Syntax nicht stimmen, sorry.
    ''' Habe schon lange nicht mehr mit VB gearbeitet...

    Ich habe Deinen Beitrag als Antwort vorgeschlagen, weil Jörg Rocktäschel bestätigt hat, dass er ihm weitergeholfen hat. Würdest Du jedoch den Codeausschnitt der VB.NET-Syntax annähern, und zwar: != durch <> und Null durch Nothing ersetzen und ein Leerzeichen zwischen END und IF einfügen?

    Gruß,
    Dimitar


    Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.

    Montag, 20. Juli 2015 13:43
    Administrator
  • Alle Änderungen angewendet, Dimitar.


    © 2015 Thomas Roskop
    Germany //  Deutschland

    Montag, 20. Juli 2015 15:21