TreeView mit Datenbankanbindung

  • VB.NET

Es gibt 13 Antworten in diesem Thema. Der letzte Beitrag () ist von peggy.denis.

    TreeView mit Datenbankanbindung

    Hallo,

    ich habe eine Frage zu Unterknoten...

    ich besitze mehrere Tabellen mit einer 1:n Beziehung um Warengruppen und Untergruppen zu realisieren im folgendem Format

    Warengruppe
    - Untergruppe1
    - - Untergruppe2
    - - - Untergruppe3 etc.

    Die Warengruppe hat die Spalten ID, und Artikelgruppe, alle weiteren in Beziehung stehenden untergeordneten Tabellen bestehen aus ID, Untergruppe.._ID und Untergruppe.. !

    Ich möchte nun diese Tabellen in ein TreeView laden.
    mit der ersten Tabelle("Warengruppe") hab ich das auch mit folgendem Code geschafft:

    Quellcode

    1. Imports System.Data.SqlClient
    2. Imports System.Data
    3. Public Class Form2
    4. Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    5. Dim connstr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"
    6. Dim conn As New SqlConnection(connstr)
    7. Dim cmd As New SqlCommand("SELECT * FROM Artikelgruppe", conn)
    8. conn.Open()
    9. Dim dr As SqlDataReader = cmd.ExecuteReader()
    10. While dr.Read()
    11. Dim tn As TreeNode = New TreeNode()
    12. tn.Text = dr("Artikelgruppe").ToString()
    13. TreeView1.Nodes(0).Nodes.Add(tn)
    14. End While
    15. dr.Close()
    16. conn.Close()
    17. End Sub
    18. End Class


    Mir werden auch beim debuggen alle vorhanden Artikelobergruppen angezeigt.
    nun möchte ich aber noch die dazugehörigen untergruppen in den entsprechenden Obergruppen anzeigen lassen wie kann ich das realisieren.

    Für jede Warengruppe sollen wenn man benötigt ca. 20Untergruppen entstehen

    Warengruppe
    - Untergruppe1
    .
    .
    .
    - - - - - Untergruppe20

    Vielen Dank für eure Hilfe
    Hi!

    Das ganze ist am besten über einen rekursiven Funktionsaufruf lösbar.

    Angenommen es sind alle Gruppen und Untergruppen in einer Tabelle:
    Zuerst ein Select, bei dem alle Einträge raus kommen, wo die ÜbergruppenID 0 ist, dann für jeden Treffer eine Sub aufrufen, die ein Select macht, bei dem alle Einträge raus kommen, wo die ÜbergruppenID = ID ist. Diese Funktion ruft sich dann selbst mit dem eigenen Ergebnis auf.
    Anstatt, dass du jedes mal eine neue Verbindung herstellst, solltest du die Verbindung (das cmd und den dr aber nicht) Private in der Klasse deklerieren.


    mfG Andy
    Wenn Waren- und Untergruppen die gleichen Attribute haben, ist es durchaus angebracht, alles in einer Tabelle unterzubringen:

    Quellcode

    1. ID Gruppenname Vorgänger
    2. 1 Warengruppe NULL
    3. 2 Untergruppe1 1
    4. 3 Untergruppe1.1 2
    5. 4 Untergruppe2 1

    Vorgänger "NULL" ist also eine Warengruppe, Vorgänger "1" wäre die Gruppe mit der ID 1.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Agent“ ()

    Hallo nochmal hab jetzt einiges probiert aber entweder habe ich alle Gruppen und Untergruppen unter einem Knoten oder nix.

    Ich bräuchte villeicht nähere Erläuterung zum obigen Vorschlag vielleicht wie ich die SELECT-Anweisung schreiben muss oder Die Tabelle. Besteht die Tabelle eigentlich aus Beziehungen. Irgendwie tue ich mir auch schwer alles in einer Tabelle unterzubringen da später nur noch über ein DataGridView Daten angezeigt und editiert werden und nicht in der Tabelle.

    Lässt sich eigentlich realisieren wenn mein TreeView funktioniert das wenn ich einen bestimmten Knoten gewählt habe das dann rechts in einem DataGrid entsprechend noch die Artikel angezeigt werden die in diesem ausgewählten Knoten stehen? Weil wenn das nicht geht muss ich mir eh was anderes überlegen.

    Ich habe sonst keine andere IDEE wie aus einer WinForm Oberfläche Warengruppen entsprechende Untergruppen in den Warengruppen sowie dann anschließend Artikel zugehörig zu erstellen.

    Vielen, Vielen Dank schon mal
    Hi!

    Das mit dem Grid ist möglich.
    Du legst einfach eine Zabelle für alle Gruppen und Untergruppen an und eine zweite für alle Produkte. Nachher brauchst du nur noch ein Select in den Produkten, dass alle ausliest, die als Gruppe die ausgewählte Gruppe haben.

    Um die beim bisherigen Code helfen zu können benötigen wir schon Auszüge aus deinem Code ;)
    Oder ist dir etwas unklar an meinem Denkansatz?
    Oder kannst dus überhaupt nicht umsetzen?


    mfG Andy
    Hallo Andy

    Wenn ich alle Gruppen und Untergruppen in eine Tabelle schreibe. Was habe ich dann später für Möglichkeiten über die WinForm Oberfläche benutzerfreundliche Eingaben zu machen also Warengruppen und Untergruppen anzulegen oder lässt sich das auch über das Treeview steuern wäre ja toll.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „peggy.denis“ ()

    Wo liegt das Problem? Hast du die Untergruppen schon in dem Treeview dargestellt? Kannst du die einzelnen Knoten bei einem klick wieder eindeutig identifizieren (Key=ID)? Weißt du, wie man in der Datenbank lesen und schreiben kann? Wenn ja, solltest du das auch mit Sicherheit hinbekommen, andernfalls das Problem detaillierter, vorzugsweise mit Quelltext, beschreiben.
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Hat soweit bisher geklappt jedoch immer davon ausgegangen das Warengruppen und Untergruppen während der Entwurfszeit schon feststehen müssen wenn jetzt jedoch ein User später die Gruppen löscht und wieder hinzufügt stimmt die ID nicht mehr die im Quellcode verankert ist
    Also ich habe jetzt eigentlich nur ein Problem damit wenn ich auf ein Knoten gehe das die ID ausgelesen wird und entsprechend ausgewertet wird mein aktueller Code ist folgender:

    Quellcode

    1. Imports System.Data.SqlClient
    2. Imports System.Data
    3. Imports System.Xml
    4. Public Class Form2
    5. Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    6. Dim connstr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"
    7. Dim conn As New SqlConnection(connstr)
    8. conn.Open()
    9. Dim cmd As New SqlCommand("SELECT * FROM tbl_WG", conn)
    10. Dim dr As SqlDataReader = cmd.ExecuteReader()
    11. While dr.Read()
    12. Dim tn As TreeNode = New TreeNode()
    13. tn.Text = dr("WG").ToString()
    14. TreeView1.Nodes.Add(tn)
    15. End While
    16. dr.Close()
    17. Dim cmd2 As New SqlCommand("SELECT * FROM tbl_UG1 WHERE (tbl_UG1.WG_ID =1)", conn)
    18. Dim dr2 As SqlDataReader = cmd2.ExecuteReader()
    19. While dr2.Read()
    20. Dim tn2 As TreeNode = New TreeNode()
    21. tn2.Text = dr2("UG1").ToString()
    22. TreeView1.Nodes(0).Nodes.Add(tn2)
    23. End While
    24. dr2.Close()
    25. Dim cmd3 As New SqlCommand("SELECT * FROM tbl_UG2 WHERE (tbl_UG2.UG1_ID =1)", conn)
    26. Dim dr3 As SqlDataReader = cmd3.ExecuteReader()
    27. While dr3.Read()
    28. Dim tn3 As TreeNode = New TreeNode()
    29. tn3.Text = dr3("UG2").ToString()
    30. TreeView1.Nodes(0).FirstNode.Nodes.Add(tn3)
    31. End While
    32. dr3.Close()
    33. conn.Close()
    34. End Sub
    35. End Class
    (tbl_UG1.WG_ID =1)

    Warum schreibst du hier eine "1" rein und nicht die ID von der Warengruppe?
    Beim einlesen der Warengruppen weißt du dem knoten nur einen Text zu, es gibt aber noch andere wichtige Eigenschaften wie z.B. Key, wo dann die ID aus tbl_WG rein kommt (z.b. Key = "wg" & ID)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau
    Wo soll ich die eigenschaft beschreiben (key)
    als neue Zeile darunter oder darüber oder mit in dieser was sicher unwarscheinlich is weil sie ja als text definiert ist.

    Quellcode

    1. tn2.Text = dr2("UG1").ToString()


    in nachfolgender Zeile habe ich die ID von der Warengruppe drin habe aber das Problem das in der Untergruppe alle Untergruppen drin stehen es kommt als nicht zum selektieren wie auch, welchen Wert soll die Anweisung dafür nehmen.

    Quellcode

    1. ("SELECT * FROM tbl_UG2, tbl_UG1 WHERE (tbl_UG2.UG1_ID =tbl_UG1.ID)", conn)
    Etwa so:

    VB.NET-Quellcode

    1. Imports System.Data
    2. Imports System.Xml
    3. Public Class Form2
    4. Private Sub Form2_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    5. Dim connstr As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True;User Instance=True"
    6. Dim conn As New SqlConnection(connstr)
    7. conn.Open()
    8. Dim cmd As New SqlCommand("SELECT * FROM tbl_WG", conn)
    9. Dim dr As SqlDataReader = cmd.ExecuteReader()
    10. While dr.Read()
    11. Dim tn As TreeNode = New TreeNode()
    12. tn.Text = dr("WG").ToString()
    13. tn.Key = "wg" & dr("ID").ToString() 'Key kann auch anders heißen
    14. TreeView1.Nodes.Add(tn)
    15. Dim cmd2 As New SqlCommand("SELECT * FROM tbl_UG1 WHERE (tbl_UG1.WG_ID =" & dr("ID").ToString() & ")", conn)
    16. Dim dr2 As SqlDataReader = cmd2.ExecuteReader()
    17. While dr2.Read()
    18. Dim tn2 As TreeNode = New TreeNode()
    19. tn2.Text = dr2("UG1").ToString()
    20. tn2.Key = "ug" & dr2("ID").ToString()
    21. TreeView1.Nodes("wg" & dr("ID").ToString()).Nodes.Add(tn2)
    22. wend
    23. dr2.Close()
    24. wend
    25. dr.Close()
    26. conn.Close()
    27. End Sub
    28. End Class

    Um dies dynamisch zu machen, musst du daraus nur noch eine rekursive Funktion basteln, und du kannst beliebig viele Untergruppen erstellen. Wenn der user auf einen knoten klickt, weißt du automatisch anhang des keys ob es eine Warengruppe ist und welche ID diese in der DB hat. (Left und Right-Funktionen)
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

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