TreeView / Nodes / dynamisch hinzufügen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    TreeView / Nodes / dynamisch hinzufügen

    Moin Leute,

    habe eine Denkblokade.
    Ich habe ca. 20 Arrays die die Vernetzung meiner IT-Systeme beinhalten.
    Eine davon sieht z.B. so aus:


    Jetzt möchte ich diese Struktur gerne in mein Treeview laden. Und zwar schön.

    VB.NET-Quellcode

    1. 'Treeview füllen
    2. Dim cc As Integer = DT.Columns.Count
    3. Dim tn As TreeNode = Nothing
    4. Dim parentnode As String = ""
    5. For Each dtr As DataRow In DT.Rows
    6. Dim ccount As Integer = 0
    7. Do While ccount < cc
    8. If ccount = 0 Then
    9. Dim ntn As TreeNode = New TreeNode
    10. ntn.Text = dtr.Item(ccount)
    11. ntn.Name = dtr.Item(ccount)
    12. TreeView1.Nodes.Add(ntn)
    13. tn = ntn
    14. Else
    15. Dim ntn As TreeNode = New TreeNode
    16. ntn.Text = dtr.Item(ccount)
    17. ntn.Name = dtr.Item(ccount)
    18. tn.Nodes.Add(ntn)
    19. tn = ntn
    20. End If
    21. ccount += 1
    22. Loop
    23. Next


    Mit diesem Code passiert folgendes:


    Alle Knoten drin, aber leider auch leeren Quatsch und total non-sence.

    Natürlich will ich die Nodes richtig setzen. Und leere ausgrenzen.

    VB.NET-Quellcode

    1. 'Treeview füllen
    2. Dim cc As Integer = DT.Columns.Count
    3. Dim tn As TreeNode = Nothing
    4. Dim parentnode As String = ""
    5. For Each dtr As DataRow In DT.Rows
    6. Dim ccount As Integer = 0
    7. Do While ccount < cc
    8. If Not dtr.Item(ccount) = "" Then
    9. If ccount = 0 Then
    10. Dim ntn As TreeNode = New TreeNode
    11. ntn.Text = dtr.Item(ccount)
    12. ntn.Name = dtr.Item(ccount)
    13. TreeView1.Nodes.Add(ntn)
    14. tn = ntn
    15. Else
    16. Dim ntn As TreeNode = New TreeNode
    17. ntn.Text = dtr.Item(ccount)
    18. ntn.Name = dtr.Item(ccount)
    19. tn.Nodes.Add(ntn)
    20. tn = ntn
    21. End If
    22. End If
    23. ccount += 1
    24. Loop
    25. Next


    Passiert das:


    Auch Müll. Mir fehlt den richtigen letzten Knoten zu speichern und an diesem dann wieder anzusetzen. Jemand eine Idee wie ich das smart und flexibel hinbekomme? Ist doch sicher ganz leicht :D
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

    razzzer530i schrieb:

    VB.NET-Quellcode

    1. tn = ntn
    Ohne das getestet zu haben: Lass mal diese Zeile weg. Teste, ob in beiden If-Zweigen.
    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!
    mir reicht die Problembeschreibung nicht.
    Als Input gibts dieses Bildle einer 4-Spaltigen Tabelle mit vollkommen unverständlichen Spalten-Bezeichnungen.
    Und was die Spalten bedeuten, und wie - ausgehend von dieser Tabelle eine Baumstruktur aufgebaut werden soll, ist mir auch schleierhaft.
    Aber es gibt 2 Beispiele für falsche Ergebnisse.

    Hilfreich wäre aber ein Beispiel, was zeigt, wies richtig wäre.

    Also insgesamt eine Input/Output - Problembeschreibung wäre zielführend, denke ich.
    @RodFromGermany funktioniert leider nicht.
    @ErfinderDesRades:


    Es handelt sich bei dieser Art von Tabelle um eine Netzwerk Struktur.

    Spalte eins, z.B. der Hauptswitch, Spalte 2, seine x Anschlüsse, usw.
    Dachte eigentlich das die Tabelle recht einfach zu verstehen ist.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    @razzzer530i Erstell Dir im Designer in einem TreeView einen TreeNode, der Dein gewünschtes Aussehen hat und sieh in der FormX.Designer.vb nach, wie das im Designer gemacht wird.
    Das empfinde nach.
    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!
    @RodFromGermany du verstehst mein Problem in diesem Fall glaube ich nicht. Wie die nodes aussehen müssen und die Struktur, das weiß ich ja. Das kriege ich auch alles hin. Das Problem ist nur, dass ich nicht weiß, wie ich mir einen ganz bestimmten node speichere um das an diesen wieder anzusetzen.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    Sorry - ich kann keinen Zusammenhang zw. deim Tabellen-Bildchen aus post#1 und deim SoSolles-Bildchen (post#4) erkennen.
    In Solles taucht zB ein Node "Router" auf, der in der Tabelle nirgends geführt ist.

    Eine Input/Output - Problembeschreibung müsste iwie einen Ansatz bieten, nach welcher Logik sich aus dem (gezeigten) Input der (gezeigte) gewünschte Output ergeben soll.

    Aber deine Problembeschreibung präsentiert quasi als Input ein Stück Fleisch, und als Output eine Sacher-Torte.
    wo kommen die Daten denn her?
    erstelle dir doch ein typ. Dataset und bilde in den Tabellen deine Struktur ab.
    dann kannst du doch ganz einfach die Datenstruktur ins Treeview laden.

    Beispeilcode!! nicht für C&P gedacht:

    VB.NET-Quellcode

    1. Private Sub FillTreeNode(ByVal dt As DataTable, ByVal tv As TreeView)
    2. Dim mainNode As TreeNode
    3. Dim subNode As TreeNode
    4. tv.Nodes.Clear()
    5. For Each row As DataRow In dt.Rows
    6. mainNode = Searchnode(row.Item(1).ToString(), tv)
    7. If mainNode IsNot Nothing Then
    8. For Each row2 As DataRow In row.GetChildRows("FK_Project_Snippet")
    9. subNode = New TreeNode(row2(1).ToString())
    10. subNode = Searchnode(row2.Item(1).ToString(), tv)
    11. mainNode.Nodes.Add(subNode)
    12. Next
    13. Else
    14. mainNode = New TreeNode(row.Item(1).ToString())
    15. For Each row2 As DataRow In row.GetChildRows("FK_Project_Snippet")
    16. subNode = New TreeNode(row2.Item(1).ToString())
    17. mainNode.Nodes.Add(subNode)
    18. Next
    19. tv.Nodes.Add(mainNode)
    20. End If
    21. Next
    22. End Sub
    23. Private Function Searchnode(ByVal nodetext As String, ByVal tv As TreeView) As TreeNode
    24. For Each node As TreeNode In tv.Nodes
    25. If node.Text = nodetext Then Return node
    26. Next
    27. Return Nothing
    28. End Function
    "Hier könnte Ihre Werbung stehen..."

    razzzer530i schrieb:

    Das Problem ist nur, dass ich nicht weiß, wie ich mir einen ganz bestimmten node speichere
    So was:

    VB.NET-Quellcode

    1. Dim nodeMem As TreeNode = CType(nodeX.Clone(), TreeNode)
    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!
    Moin Leute, sorry war leider verhindert und konnte nicht nachschauen was so passiert.
    Zum besseren Verständnis für euch:


    Diese Tabelle


    muss zu diesem TV werden:


    TreeNode "Beispiel" wird beim Import erstellt. D.h.: Der erste Node der aus der Tabelle generiert wird muss diesem Node Untergeordnet sein.
    Wobei ich alles ab dem Feld "INFO" in den ToolTipText des letzten Gerätes eintrage(Gerät3). Diese Struktur ist allerdings nicht fix und es können spalten dazu kommen. Klar ixch kann mir immer die columnID von "INFO" holen und bis dahin die nodes erstellen und alles danach dann in den ToolTipText einfügen.

    Versuche jetzt aber seit Tagen die Nodes zu erstellen. Wie genau kriege ich sowas hin? Muss doch garantiert rekursiv hinzufügen- Aber wie geht das? Wüäre unendlich dankbar wenn mir da jemand zur Lösung verhelfen könnte.
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    ich denke dein Datenmodell ist falsch. Alles in einer Tabelle und dann ins TreeView wird schwierig.
    Teile deine Tabellen doch auf. Ich würde eine Tabelle Switch machen, eine Tabelle Ports (untergeordnet zu switch) und eine Tabelle Geräte (untergeordnet zu ports)
    Das kannst Du dann fein im Treeview abbilden.
    Beispiel würde ich (wenn es nur eine Company gibt) auch hardcoded eintragen, oder eben ne Übergeordnete Tabelle Company...
    "Hier könnte Ihre Werbung stehen..."
    @MichaHo
    ich kann die Tabelle leider nicht abändern. Ich muss sie in genau diesem Vormat vorlegen können. Also das Format der Tabelle ist leider vorgegeben. Finde sie selbst sehrunpraktisch.
    Das ist ja das problem beim einlesen als Treenodes :x
    Hat da denn jemand eine Idee, wie ich diesen rotz vlt sinnvoll convertieren kann? Symbole sind egal. Geht nur um diese idiotische Struktur :x
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~

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

    ich weiß wie's geht (sogar mehrere Varianten), aber es ist so oder so ein recht trickreicher Algo, und ich grad keine Zeit.

    Ein Punkt ist: Es geht grad nicht rekursiv.
    Sondern man muss jede Tabellenzeile durchgehen, und die Zellen auffassen wie Segmente eines DateiPfades.
    Und dann je "Pfad" in 2 Schritten vorgehen:
    1. Segmentweise muss man sich dann durch den Treeview hangeln, bis man an einen Treenode gerät, der fürs nächste Segment keinen passenden Unter-Node enthält.
    2. Ab da muss man neue Treenodes generieren, ebenfalls segmentweise, und die wie eine Kette in den vorhandenen einhängen
    @ErfinderDesRades

    So, sorry viel zutun:x

    Also habe mal eine Tabelle in diesem Format mit falschen IPs und Macs in ne rar gepackt.
    Möchte ja auch, dass die Beschreibung(Alles was ab Spalte "Info" kommt) in den ToolTipText gepackt wird. Überfordert mich echt.
    Wichtig ist mir nur:
    Ich lese diese Tabelle ja bereits in eine DataTable ein. Würde gerne verstehen,wie ich die Daten aus dem DataTable in den Treeview bekomme.
    VBHELP.rar
    Das ist extra ne EXCEL ohne Makros.

    Wenn du mir erklärst oder basteln kannst, wie man aus dem DT einlesen kann, wäre das echt ein Traum. Verzweifel wirklich dran. Und dass man das nicht rekursiv macht, verblüfft mich völlig :o
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    deine Daten sind nicht ganz eindeutig, aufgrund der leeren Zellen, die da auftreten.
    ich vermute mal, dass eine Leerzelle bedeuten soll, dass der wert darüber auch für diese Zelle gilt.
    Nur ab spalte E ist die Bedeuting anders: wenn in E Leerzellen auftreten, soll das bedeuten, dass der treenode dann wirklich leer bleibt.

    richtig interpretiert?
    @ErfinderDesRades

    Richtig verstanden.
    Spalte A z.B. repräsentiert hier nur den Hauptswitch(SW01). Spalte B seine Anschlüsse. Alles was z.B. in Spalte B Unter 1 leer ist bis die 2 kommt, lässt nur den Platz, um alles besser lesen zu können.
    Natürlich könnte man auch immer wieder den vorherigen Wert nehmen.
    Dein Projekt funktioniert zwar schon, aber leider nicht so wie ich mir das Vorstelle. Er ordnet die Nodes afalsch an. Also aus Spalte B:
    1
    2
    3
    4
    5
    6
    7
    8

    wird dann z.b.
    1
    10
    6
    2
    8
    4
    3
    5
    9
    . Ich verstehe noch nicht so recht wieso das so ist.
    Die Tabelle die ich dir gegeben habe ist ja nur halb so lang wie die Originale.
    Die habe ich gerade mal versucht einzulesen und da kommt völlig falsches zeug raus.
    Aber verstehe auch nicht recht, wie genau eingelesen wird...
    ~Wir leben zwar alle unter dem gleichen Himmel, aber es haben nicht alle den gleichen Horizont~
    ich habe textuelle Daten, daraus ergibt sich eine textuelle Sortierung.
    Die Sortierung, die du angibst glaub ich dir nicht.
    guck da bitte nochmal nach

    jo - ist offsichtlich Quark
    ZB Unten taucht eine 10 auf, die oben garnet vorkommt.

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