Treeview Elemente über ID's verketten

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Superuse.

    Treeview Elemente über ID's verketten

    Hallo,

    ich möchte gerne ein Treeview mit Daten aus einer Datenbank befüllen. Das klappt eigentlich auch schon soweit. Ich möchte aber nicht, dass das Treeview die Daten anhand des Textes miteinander verkettet, sondern anhand der VaterID.
    Das soll z.B. so aussehen:

    VaterID Hier steht der Text, der angezeigt werden soll
    ->KindID Hier steht der Text zur KindID
    ->KindID Text...
    ->KindID andere TExt

    Datensatz sieht dann so aus

    VaterID
    KindID
    Text

    1
    oberster Eintrag
    1
    2
    erster Kindeintrag
    2
    3
    Kind unter dem ersten Kind
    2
    4
    zweiter Kindeintrag unter Haupteintrag

    Ich habe aber bislang keine Möglichkeit gefunden, die Einträge im Tree mit einer ID anzulegen und im Vordergrund den Text anzugeben. Ich möchte nicht, das die Einträge anhand Ihres Textes verkettet werden, da hier Texte doppelt vorkommen können,
    die aber im Baum nicht logisch zusammen gehören.
    Geht das überhaupt? .add nimmt hier nur Objekte Treeview oder Strings
    Da afaik das TreeView Control nur mit Strings zum Bilden des Baumes arbeitet, musst du dich selbst um die Verkettung der Elemente kümmern.
    Das TreeView und die TreeNode Objekte haben jeweils die Property Nodes das wiederum die Funktion Add(TreeNode node) hat.
    Dadurch kannst du selbst Nodes unter andere Nodes setzen oder dem TreeView hinzufügen.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
    Idee dahinter ist ein Ticketsystem, das auf einer Datenbank basiert.
    Es gibt zu einer ankommenden Mail normalerweise oder oder mehrere Antworten und dazu wieder eine Rückantwort des Kunden. Das soll über eine Baumstruktur angezeigt werden. Jedes Ticket bekommt eine eindeutige Nummer. Das soll im Baum dann so aussehen:

    Ticket 0815 Kundenanfrage
    ---------> AW: Antwort an Kunde
    ----------------> Rückantwort von Kunden
    Ticket 0816 Kundenanfrage
    ---------> AW: Antwort an Kunde
    ----------------> Rückantwort von Kunden
    ----------------> weitere Rückantwort vom Kunden
    ------------------------> AW: Weitere Antwort an den Kunden

    etc.
    Da jede Nachricht eine eindeutige ID in der Datenbank hat, würde ich diesen Baum gerne über die ID's aufbauen

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

    meine Ahnung, dass es darum geht, Datensätze im Treeview anzuzeigen, verdichtet sich, auch wenn noch immer nicht wirklich danach gefragt wurde.
    Zumindest den ersten Link von @HenryV finde ich hierfür sehr geeignet, auch wenn ich infrage stelle, ob der TE damit klarkommt - weil ist super-generisch gelöst.

    Den 2. Link verstehe ich nicht - da wird unter anderem die Property Treenode.PopulateOnDemand verwendet, die es laut meines ObjectBrowsers leider garnet gibt.
    Ah, ja.
    Die Frage ist als asp.net - Frage getaggt - ist also tatsächlich nicht relevant für den hiesigen Thread.
    Ja, meine Frage ist letztendlich, Datensätze in einem Treeview anzuzeigen. Habe ich meines erachtens aber indirekt geschrieben.

    Ich habe das ASP-Beispiel mal etwas angepasst, scheitert aber gerade noch an eventuell 1 Zeile

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class Form1
    3. Dim dttree As New DataTable()
    4. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    5. Dim sql As String
    6. Dim ds As New DataSet
    7. Dim Verbindung As String = "server=192.168.0.3;port=3307;uid=root;pwd=xxx;database=ticketsystem;Convert Zero Datetime=True"
    8. sql = "Select * from kopf"
    9. Dim da As MySqlDataAdapter = New MySqlDataAdapter(sql, Verbindung)
    10. da.Fill(dttree)
    11. AddNodes(-1, TreeView1.Nodes)
    12. End Sub
    13. Private Sub AddNodes(ByVal id As Integer, ByVal tn As TreeNodeCollection)
    14. For Each dr As DataRow In dttree.[Select]("KindID = " & id)
    15. Dim [sub] As TreeNode = New TreeNode(dr("Betreff").ToString())
    16. tn.Add([sub])
    17. [b]AddNodes(Convert.ToInt32([sub].Value), [sub].ChildNodes)[/b]
    18. Next
    19. End Sub
    20. End Class


    .Value), [sub].ChildNodes
    Diese beiden Werte kennt er nicht
    Genial. Genau das, was ich gesucht habe. Hab das etwas abgewandelt und so funktioniert es:

    VB.NET-Quellcode

    1. Dim sql As String
    2. sql = "Select * from kopf"
    3. Dim myData As MySqlDataReader
    4. Dim conn As New MySqlConnection ' Für die Verbindung zur Datenbank
    5. Dim myCommand As New MySqlCommand
    6. Dim myAdapter As New MySqlDataAdapter
    7. conn.ConnectionString = "server=192.168.0.3;port=3307;uid=root;pwd=;database=ticketsystem;Convert Zero Datetime=True"
    8. conn.Open()
    9. myCommand.Connection = conn
    10. myCommand.CommandText = sql
    11. myAdapter.SelectCommand = myCommand
    12. myData = myCommand.ExecuteReader()
    13. Dim Node As TreeNode
    14. While myData.Read
    15. Node = New TreeNode(myData("Betreff"))
    16. Node.Name = myData("ID")
    17. If myData("Kindid") <> 0 Then
    18. TreeView1.Nodes.Find(myData("Kindid"), True)(0).Nodes.Add(Node)
    19. Else
    20. TreeView1.Nodes.Add(Node)
    21. End If
    22. End While
    23. TreeView1.ExpandAll()
    24. Application.DoEvents()