VB.Net - Wie, um dynamicaly Suche nach einem string in allen TreeView-Knoten erweitern und reduzieren von Knoten matching (oder nicht), den such-string?

Ich versuche zu implementieren dynamische Suche auf einer treeview-Komponente, und ich bin fast fertig mit ihm, außer, dass seit seiner eine dynamische Suche auf der Grundlage der textchanged-Ereignis der textbox, die ersten Zeichen der Zeichenkette werden immer gefunden, so dass die Suche-Funktion erweitern Sie alle Knoten, weil Sie ein gültiges match.

Der Sache ist, dass, wie der Suchbegriff immer mehr, diejenigen Knoten, die sich erweitert, wenn Sie hatte ein Spiel, jetzt muss reduziert werden, weil Sie nicht mehr der Suchzeichenfolge entsprechen... und das ist nicht passiert... ich konnte nicht finden, noch eine Möglichkeit zum reduzieren und erweitern Sie den Knoten dinamically wie der Suchbegriff ändert...

Ich habe ein video hochgeladen und der Visual Studio 2012 solution so nehmen Sie einen Blick auf Sie und sehen, wo Im fallen den ball...

Dies ist der code meiner Funktion, der Suche: (Sie können im video sehen, es funktioniert wie erwartet, also mein problem ist das aufklappen/Zuklappen der Knoten, als Sie übereinstimmen(oder nicht), den such-string.

Ive implementiert einige Ideen in der "FindRecursive" - Funktion zu reduzieren und erweitern Sie die Knoten, aber es funktioniert nicht wie erwartet. Ich schaffte es sogar die Steuerung in einer Endlosschleife durch meine falsche Logik.

Jede Hilfe wird sehr geschätzt,

Tks!

Video zeigt das problem

Visual Studio 2012-Projekt + Test-Datei

Private Sub txtFiltroIDs_TextChanged(sender As Object, e As EventArgs) Handles txtFilterToolIDs.TextChanged
        ClearBackColor()
        FindByText()
    End Sub

    Private Sub FindByText()
        Dim nodes As TreeNodeCollection = tviewToolIDs.Nodes
        Dim n As TreeNode
        For Each n In nodes
            FindRecursive(n)
        Next
    End Sub

    Private Sub FindRecursive(ByVal tNode As TreeNode)
        If txtFilterToolIDs.Text = "" Then
            tviewToolIDs.CollapseAll()
            tviewToolIDs.BackColor = Color.White
            ExpandToLevel(tviewToolIDs.Nodes, 1)
        Else
            Dim tn As TreeNode
            For Each tn In tNode.Nodes
                ' if the text properties match, color the item
                If tn.Text.Contains(txtFilterToolIDs.Text) Then
                    tn.BackColor = Color.Yellow
                    tn.EnsureVisible()        'Scroll the control to the item
                End If

                FindRecursive(tn)
            Next
        End If
    End Sub

    Private Sub ClearBackColor()
        Dim nodes As TreeNodeCollection
        nodes = tviewToolIDs.Nodes
        Dim n As TreeNode
        For Each n In nodes
            ClearRecursive(n)
        Next
    End Sub

    Private Sub ClearRecursive(ByVal treeNode As TreeNode)
        Dim tn As TreeNode
        For Each tn In treeNode.Nodes
            tn.BackColor = Color.White
            ClearRecursive(tn)
        Next
    End Sub
Also neben der änderung der Hintergrundfarbe, wenn Sie die "reset" - für eine neue Suche, Sie brauchen, to Zuklappen der Knoten. Auf diese Weise werden nur die Spiele werden erweitert und gefärbt mit der neuen such-Ergebnisse. Derzeit tun Sie das mit CollapseAll(), aber nur, wenn das Suchfeld leer ist.
Idle_Mind, vielen Dank für die Antworten... ich habe versucht, fügen Sie eine tviewToolIDs.CollapseAll() am Anfang von "FindRecursive" - Funktion... Es hängt die Anwendung..
Sie würden auch brauchen, um zu unterdrücken, die Bildschirmaktualisierung während Sie alles neu einstellen und dann die Farbe/erweitern Sie die Spiele. Sie können dies durch aufrufen von BeginUpdate, die Durchführung der änderungen aufrufen EndUpdate um es neu zu zeichnen, in den neuen Staat.

InformationsquelleAutor Daniel Santos | 2015-06-14

Schreibe einen Kommentar