TreeView füll algorithmus mithilfe von parentid

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von win98.

    TreeView füll algorithmus mithilfe von parentid

    Hallo.

    ich habe bis jetzt folgenden code:

    VB.NET-Quellcode

    1. Private Sub btnPlanIds_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPlanIds.Click
    2. Dim trdum As New TreeView
    3. Dim v0 As Integer = 2
    4. xliApp = CreateObject("EXCEL.APPLICATION")
    5. xliWB = xliApp.Workbooks.Open(Pfad_i)
    6. With trdum
    7. .Dock = DockStyle.Fill
    8. Do
    9. If xliWB.Sheets("pro_node").Cells(v0, 3).Text = "0" Then
    10. .Nodes.Insert(0, xliWB.Sheets("pro_node").Cells(v0, 2).Text)
    11. With .Nodes(0)
    12. 'usw usw usw
    13. 'HILFE :P
    14. End With
    15. End If
    16. v0 = v0 + 1
    17. Loop Until xliWB.Sheets("pro_node").Cells(v0, 2).Text = ""
    18. End With
    19. Panel1.Controls.Add(trdum)
    20. xliWB.Close()
    21. xliWB = Nothing
    22. xliApp = Nothing
    23. End Sub


    im großen und ganzen ist lese ich aus einer excel tabelle werte aus. die excel hab ich mal im anhang hochgeladen.

    darin sind informationen zu einem treeview enthalten. d.h. jedes element hat einmal eine eigene ID und einmal eine parent ID dem es untergeordnet ist.

    ich hab bis jetzt die elemente mit parentID 0 ausgelesen, weil das das höchste element ist und habe den knoten erstellt.

    jetzt möchte ich alle unterknoten mit parentID 1 hinzufügen, und so weiter. wie die treeview aussehen soll ist auch im anhang zu sehen.

    soe wie ich den code angefangen habe müsste das theoretisch klappen, wenn ich so viele schleifen wie ebenen erstelle. ich möchte den code aber dynamisch haben, d.h. der code soll auch funktionieren wenn ich 2, 3, 6, 70, 210, oder 10000 ebenen haben.

    weiß jemand rat, oder ein tipp?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „win98“ ()

    Hi

    so könnte man es ungefährt machen:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim trdum As New TreeView
    3. Dim v0 As Integer = 2
    4. Dim xliApp = CreateObject("EXCEL.APPLICATION")
    5. Dim xliWB = xliApp.Workbooks.Open(pfad_i)
    6. With trdum
    7. .Dock = DockStyle.Fill
    8. Do
    9. Dim NewNode As TreeNode = New TreeNode
    10. NewNode.Text = xliWB.Sheets("pro_node").Cells(v0, 2).value
    11. NewNode.Name = xliWB.Sheets("pro_node").Cells(v0, 1).value
    12. Dim ind As Integer = CInt(xliWB.Sheets("pro_node").Cells(v0, 3).value)
    13. If ind > 0 Then
    14. Dim nodes As TreeNodeCollection = trdum.Nodes
    15. Dim n As TreeNode
    16. For Each n In nodes
    17. If n.Name = ind.ToString Then
    18. n.Nodes.Add(NewNode)
    19. Exit For
    20. End If
    21. If findParent(n, ind.ToString, NewNode) Then
    22. Exit For
    23. End If
    24. Next
    25. Else
    26. trdum.Nodes.Add(NewNode)
    27. End If
    28. v0 = v0 + 1
    29. Loop Until xliWB.Sheets("pro_node").Cells(v0, 1).Text = ""
    30. End With
    31. Panel1.Controls.Add(trdum)
    32. xliWB.Close()
    33. xliWB = Nothing
    34. xliApp = Nothing
    35. End Sub
    36. Private Function findParent(ByVal RecNode As TreeNode, ByVal ParentName As String, ByVal NewNode As TreeNode)
    37. Dim tn As TreeNode
    38. For Each tn In RecNode.Nodes
    39. If tn.Name = ParentName Then
    40. tn.Nodes.Add(newnode)
    41. Return True
    42. End If
    43. findParent(tn, ParentName, NewNode)
    44. Next
    45. Return False
    46. End Function


    Das ist nur ein Beispiel, man sucht einfach Rekursiv nach dem Parent, und diesem fügt man dann einen neuen Node hinzu.
    Eventuell als Anregung hilfreich..

    gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    wow, hammer,

    einer rekursive methode hatte ich auch schon versucht, aber kann mit diesen "node" befehlen nicht klar.

    wie lang hasten dafür gebraucht :P

    da is zwar noch ein kleiner fehler drinne (br3x unter regelschemeata fehlt brenner31) aber ich versuch das mal mithilfe deines codes umzuändern.

    vielen dank
    Bilder
    • Zwischenablage01.jpg

      11,21 kB, 270×243, 96 mal angesehen
    Ja das liegt sicher daran, das die Tabelle von oben nach unten durchlaufen wird.
    Wenn ein Parent Node angegeben ist, der noch nicht existiert, wird kein Child Node hinzugefügt.
    Und Brenner hat als Parent die 9.
    Diese wird aber erst im nächsten Schritt angelegt..

    Entweder du achtest drauf das du die Tabelle in richtiger Reihenfolge schreibst, oder du musst die Childnodes, deren Parent er nicht finden konnte speichern und am Ende noch mal suchen


    gruss Mono
    Das ist meine Signatur und sie wird wunderbar sein!
    cool, hab jetzt die spalte der parentID aufsteigend geordnet und es gong einwandfrei.

    allerdings manuell...
    per vba makro hab ich diesen code:

    VB.NET-Quellcode

    1. Cells.Select
    2. Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Header:= _
    3. xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
    4. DataOption1:=xlSortNormal


    wie übersetz ich den code in VB?

    vielen dank für den hinweis :)