Item in einem Treeview finden und markieren.

  • VB.NET

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Item in einem Treeview finden und markieren.

    Hallo Leute,

    ich steh gerade auf dem Schlauch und brauche ein wenig Hilfe.

    Ich habe einen TreeView (tv) den ich duchsuchen möchte und das gefundene Item auch selektieren will.

    VB.NET-Quellcode

    1. tv.Nodes.Find("BlaBla", True)
    2. tv.Select()

    Das ist ja für Nodes und nicht für Items und für die Items habe ich gerade keine Idee.

    VB.NET-Quellcode

    1. For Each SuchNode As TreeNode In tv.Nodes
    2. If SuchNode.Text = "BlaBla" Then
    3. SuchNode.....(? irgenwie markieren)
    4. End if
    5. Next


    Wie gesagt Hilfe wäre nett.
    0belixx

    0belixx schrieb:

    Nodes
    kannst Du Collapsen und Expanden.
    Collapse alle und expande den einen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    0belixx schrieb:

    noch nicht markiert.
    Hat das Item eine Focus-Propertry?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    um das ganze zumindest bischen abzukürzen:
    Zunächstmal ist unklar, was dieser Satz bedeutet:

    0belixx schrieb:

    Das ist ja für Nodes und nicht für Items und für die Items habe ich gerade keine Idee.
    Was meinst du mit Items im Unterschied zu Nodes?
    In einem Treeview gibts keine Items, da gibts nur Nodes, daher ignoriere ich den Satz mal.

    Ansonsten würde ich deine Problembeschreibung präzisieren zu:
    "Ich suche im Treeview den ersten TreeNode, der einen bestimmten Text aufweist."
    Bitte bestätige oder korrigiere meine Interpretation deines Anliegens, denn ich sehe auch weitere Interpretations-Möglichkeiten, mag aber nicht endlos rumraten, oder auf etwas falsch geratenem weiter aufbauen.

    Jdfs. zum wie oben formulierten Anliegen gibts nix vorgefertigtes, sondern da musst du eine Methode selber schreiben oder dir schreiben lassen.

    Kannst du als eigenen Beitrag vlt. die Signatur so einer Methode formulieren?
    Also dir überlegen, welche Parameter du dieser Methode übergeben musst, und was ihr Rückgabewert sein soll?
    @0belixx
    Probier mal dies:

    VB.NET-Quellcode

    1. Me.TreeView1.SelectedNode = SuchNode
    und stell sicher, dass der Node gefunden wird, auch wenn er in der 42. Ebene liegt.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @ ErfinderDesRades
    Ja ich habe mich wohl unglücklich ausgedrückt.
    Habe mich jetzt belesen das alles Nodes sind. Dachte es gibt da noch einen Unterschied zwischen Item und Node.

    Habe es jetzt auch gelöst:

    VB.NET-Quellcode

    1. Private Function SuchItem(ByVal text As String, ByVal Liste As TreeNodeCollection) As TreeNode
    2. Dim SuchErgebniss As TreeNode
    3. Dim Kind As TreeNode
    4. For Each Kind In Liste
    5. If Kind.Text = text Then
    6. SuchErgebniss = Kind
    7. ElseIf Kind.GetNodeCount(False) > 0 Then
    8. SuchErgebniss = SuchItem(text, Kind.Nodes)
    9. End If
    10. Next
    11. Return SuchErgebniss
    12. End Function


    Aufruf über:

    VB.NET-Quellcode

    1. tv.SelectedNode = SuchItem("BlaBla", tv.Nodes)
    2. tv.Select()
    3. Dim Merktext As String = tv.SelectedNode.Text.ToString


    Dennoch Danke.
    Dafür gibt es jedoch bereits die Find-Methode des Treeviews:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Dim subId = 0
    3. For i As Integer = 1 To 10
    4. Dim text = String.Format("Node{0}", i)
    5. TreeView1.Nodes.Add(text, text)
    6. For j As Integer = 1 To 10
    7. subId += 1
    8. Dim subText = String.Format("Subnode{0}", subId)
    9. TreeView1.Nodes(TreeView1.Nodes.Count -1).Nodes.Add(subText, subText)
    10. Next
    11. Next
    12. End Sub
    13. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    14. Dim tn = TreeView1.Nodes.Find("Subnode25", True)
    15. If Not tn.Count = 1 Then
    16. Return
    17. End If
    18. TreeView1.SelectedNode = tn(0)
    19. TreeView1.Select()
    20. End Sub


    wichtig ist hierbei, dass die Find-Methode nach dem Key sucht und nicht nach dem Wert. Diesen kann man per .Add Überladung jedoch leicht hinzufügen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Jo, geht auch.

    Eine andere Anmerkung wäre übrigens noch, dass glaub sogar in der Mehrzahl nach Treenode.Fullpath gesucht wird - also weder nach dem Text des einzelnen Nodes, noch nach seinem Key, sondern nach dem ganzen Pfad.
    Ja, und da ist eine rekursive Suche wieder ineffizient, sondern man sollte entlang des SuchPfades segmentweise direkt auf den Ziel-Node zusteuern.

    ErfinderDesRades schrieb:

    wow - ordentlich rekursiv gecodet! :thumbsup:
    Ach - und wäre besser, die Rekursion dann auch gleich abzubrechen, sobald was gefunden.


    Es wäre nicht nur besser, es ist notwendig!
    Aktuell wird der in SuchErgebniss gefunden Node bei weiteren rekursiven Aufrufen mit Nothing überschrieben und als Ergebnis findet die Funktion nichts.

    VB.NET-Quellcode

    1. Private Function SuchItem(ByVal text As String, ByVal Liste As TreeNodeCollection) As TreeNode
    2. Dim SuchErgebniss As TreeNode
    3. Dim Kind As TreeNode
    4. For Each Kind In Liste
    5. If Kind.Text = text Then
    6. SuchErgebniss = Kind
    7. ElseIf Kind.GetNodeCount(False) > 0 Then
    8. SuchErgebniss = SuchItem(text, Kind.Nodes)
    9. End If
    10. Next
    11. Return SuchErgebniss
    12. End Function


    Richtig gehts so

    VB.NET-Quellcode

    1. Public Function TvFindNodeByText(ByVal text As String, ByVal Liste As TreeNodeCollection) As TreeNode
    2. Dim SuchErgebniss As TreeNode
    3. For Each Kind As TreeNode In Liste
    4. If Kind.Text = text Then
    5. SuchErgebniss = Kind
    6. Return SuchErgebniss
    7. ElseIf Kind.GetNodeCount(False) > 0 Then
    8. SuchErgebniss = TvFindNodeByText(text, Kind.Nodes)
    9. If SuchErgebniss IsNot Nothing Then
    10. Return SuchErgebniss
    11. End If
    12. End If
    13. Next
    14. End Function

    Das dürfte bei so einem alten Thread, bei dem v.a. der TE nicht mehr hier angemeldet ist, nicht mehr relevant sein. *Topic closed*
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.