Announcement

Collapse
No announcement yet.

Im Treeview Knoten suchen und selektieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Im Treeview Knoten suchen und selektieren

    Hallo,
    viele Recherche im Internet und Versuche mit verschiedenen Code Varianten haben mein Problem immer noch nicht gelöst.
    Ich erstelle einen kleinen Explorer. Hier fehlt mir die Funktion, dass nach dem Start ein Pfad selektiert sein soll, den ich in der Registry hinterlegt habe.
    Somit habe ich den Pfad bereits zur Verfügung.
    Jetzt soll der entsprechende Pfad im Treeview gefunden und selektiert werden.
    Das suchen und selektieren funktioniert nur bis zur 2. Ebene.
    z.B.
    -c:\
    -c:\Archiv
    -c:\Archiv\Test1

    Alles weiteren child nodes werden nicht mehr gefunden.

    Hier zeige ich mal 2 Varianten mit denen ich u.a. experimentiert habe.

    [Highlight=vbnet]
    Private Function FindNode(ByVal Text As String, ByVal Nodes As TreeNodeCollection) As Boolean
    For Each lNode As TreeNode In Nodes
    If lNode.Text = Text Then
    lNode.TreeView.SelectedNode = lNode
    Return True
    Else
    'FindNode = FindNode(Text, lNode.Nodes)
    If FindNode(Text, lNode.Nodes) Then
    Return True
    End If
    End If
    Next
    Return False
    End Function

    ' und hier die andere

    'Public Function FindNode(ByVal ParentNode As TreeNode, ByVal SearchVal As String) As TreeNode
    ' Dim tmpNode As TreeNode

    ' If ParentNode.Text = SearchVal Then
    ' Return ParentNode
    ' Else
    ' Dim child As TreeNode
    ' For Each child In ParentNode.Nodes
    ' tmpNode = FindNode(child, SearchVal)
    ' If Not tmpNode Is Nothing Then
    ' Return tmpNode
    ' End If
    ' Next
    ' End If

    ' Return Nothing
    'End Function

    [/highlight]

    Ich hoffe, dass mir jemand helfen kann.
    Zuletzt editiert von gfoidl; 16.08.2010, 23:14. Reason: [/Code]-Tags entfernt.

  • #2
    Hallo,

    den ich in der Registry hinterlegt habe.
    Statt dem Speichern von Werten in der Registry sollte das eigens vorhandene Konfigurationsmodell verwendet werden.

    Aber zurück zum eigentlichen Thema: Deine gezeigte 1. Variante schaut mir korrekt aus (zumindest ist die Rekursion zu erkennen). Geh mal mit dem Debugger Schritt für Schritt durch und schau wo es nicht passt. Das "alle weiteren Childnodes" verstehe ich jedoch nicht ganz. Im gezeigten Code wird nach dem 1. Treffer abgebrochen, d.h. er kann nur 1 Node finden.

    Die 1. Variante ließe sich zu
    [highlight=vbnet]
    Private Function FindNode(ByVal Text As String, ByVal Nodes As TreeNodeCollection) As Boolean
    For Each lNode As TreeNode In Nodes
    If lNode.Text = Text Then
    lNode.TreeView.SelectedNode = lNode
    Return True
    End If

    Return FindNode(Text, lNode.Nodes)
    Next

    Return False
    End Function
    [/highlight]
    umschreiben - die Semantik ist die selbe.


    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Hallo gfoidl, erstmal besten Dank für die Antworten.

      Das mit dem Kofigurationsmodell schau ich mir später mal an.

      Als childnode meine ich die Unterordner, die nach
      z.B.
      -c:\
      -c:\Archiv
      -c:\Archiv\Test1

      nach Test1 wie nochfolgend beschrieben Test2 usw. kommen.
      z.B.
      -c:\Archiv\Test1\Test2

      Das die Suchroutine nach dem 1. Treffer abbricht ist gewollt. Hier greift dann Struktur.select.
      Zumindestens funktioniert das bis Ebene Test1.

      Dein Vorschlag funktioniert leider nicht. Erst wenn ich folgenden Code eingebe.

      If FindNode(Text, lNode.Nodes) Then

      Return FindNode(Text, lNode.Nodes) ' Return True

      End If

      Aber das Endergebnis ist wie vorher auch.

      Beim Debuggen zeigt er mir tatsächlich nur immer die Ebenen an die zu Test1 vergleichbar sind.

      Folgendermassen ruf ich die FindNode Routine auf:

      FindNode("Test2", Struktur.Nodes).ToString()
      Vllt liegt ja daran der Fehler.

      mfg
      W.B.

      Comment


      • #4
        Hallo

        Warum schreibst du dir die Funktion selber, wenn sie schon im Framework enthalten ist?

        [highlight=vbnet] TreeView1.SelectedNode = TreeView1.Nodes.Find(Text, True)(0)[/highlight]

        cu

        Comment


        • #5
          Hallo,

          hier bekomme ich immer den Fehler 'Der Index war ausserhalb des Arraybereichs'.
          Woran kann denn das liegen.

          Ich habe bisher den Eindruck, dass ein Knoten erst selektiert sein muss bevor die nächste Ebene 'sichtbar' wird.

          Die Routinen, die ich bisher getestet habe funktionieren einfach nicht.


          Ich bin für jeden Tip dankbar.

          Comment


          • #6
            Hallo

            Kann es sein, daß du die Name Eigenschaft der Nodes nicht gesetzt hast?

            Also das funzt bei mir reibungslos.
            [highlight=vbnet] Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            FindNode(TreeView1, "Test4", True)
            End Sub
            Public Sub FindNode(ByVal tv As TreeView, ByVal NodeText As String, ByVal SubNodes As Boolean)
            Dim tc As TreeNode() = tv.Nodes.Find(NodeText, SubNodes)
            If tc.Length > 0 Then
            tv.SelectedNode = tc(0)
            Else
            MsgBox("Der Knoten " & NodeText & " ist nicht vorhanden")
            End If

            End Sub

            Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim tn As New TreeNode("C:\")
            tn.Name = "C:\"
            Dim tnn As TreeNode = tn
            For a As Integer = 0 To 8
            Dim sn As New TreeNode("Test" & a.ToString)
            sn.Name = sn.Text
            tnn.Nodes.Add(sn)
            tnn = sn
            Next
            TreeView1.Nodes.Add(tn)
            End Sub[/highlight]

            cu

            Comment


            • #7
              Hallo Hauti,

              - das setzen der Name Eigenschaft hat nichts geändert

              - dein Code hat bei mir auch funktioniert, jedoch nicht innerhalb meines Codes

              Ich habe jetzt aber eine Lösung gefunden, die zwar nicht elegant ist, aber funzt.
              Ich habe auf meine Vermutung aufgebaut, die ich schon vorher hatte, dass jeweils ein Knoten selektiert sein muss um die nächste Ebene zu sehen.

              Ich stelle diese hier zur Verfügung.

              Weiterhin bedanke ich mich für eure Vorschläge die mich doch auf die richtige Spur gebracht haben.

              [HIGHLIGHT=vbnet]
              Private Function FindNode(ByVal Text As String, ByVal Nodes As TreeNodeCollection) As Boolean
              For Each lNode As TreeNode In Nodes
              'Array-Daten müssen folgend vorliegen. C:\, C:\Archiv, C:\Archiv\Test1.....usw
              If lNode.Tag.ToString = arr(anzArray) Then
              lNode.TreeView.SelectedNode = lNode
              Struktur.Select() 'Knoten selektieren, damit die nächste Ebene 'sichtbar' wird
              anzArray += 1
              If anzArray = arr.Length Then
              anzArray = anzArray - 1 'sonst gibt es Fehler Index ausserhalb Arraybereich
              Return True
              End If
              End If

              If FindNode(Text, lNode.Nodes) Then
              Return True
              End If
              Next
              Return False
              End Function
              [/highlight]
              Zuletzt editiert von gfoidl; 23.08.2010, 00:06. Reason: highlight-Tags korrekt gestezt.

              Comment

              Working...
              X