none
VB: Treeview aus Datenbank füllen RRS feed

  • Frage

  • Hallo,
    seit langem suche ich in den Codebeispielen etwas, das mir hilft ein eigentlich einfaches Problem zu lösen, aber ich finde nichts. Ich kenn VBA aber bei VB und C# bin ich neu, deshalb hapert es schon bei der Deklaration. Ich möchte gern eine Datenbank öffnen, die eine Tabelle für die Treeview-Inhalte hat (pro Zeile: ID, Bezeichnung, Mutter-ID bzw. "0" bei oberster Ebene) z. B.

    1, Wurzel1, 0
    2, Tochter1_Wurzel1, 1
    3, Tochter2_Wurzel1, 1
    4, Wurzel2,0
    5, Tochter1Wurzel2, 4
    usw.

    Das bedeutet, dass ich nicht mit den DataBindings per Drag and Drop arbeiten kann, sondern ganz "einfach" die Datenbank und die Tabelle öffnen, die rekursiv durchforsten und damit die Knoten anlegen muss.

    1. Die Beispiele, mit denen direkt auf Tabellen zugegriffen wird, um z. B. eine Zeile auf der Konsole auszugeben, regeln die DB-Verbindung mit vordefiniereten Datentypen (siehe

    http://msdn.microsoft.com/de-de/library/bb399398.aspx   

    ... As New Northwnd),

    aber wie sieht so eine Definition aus bzw. wie kann ich eigene anlegen?

    2. Wenn dann der Baum gefüllt ist, möchte ich natürlich in einem Nachbarbereich bzw. einem 2. Formular Details zu dem jeweils angewählten Baumknoten anzeigen. Wie schaffe ich da die Verbindung zur Detaildarstellung?

    3. Wie weise ich ein Abfrageergebnis aus der Tabelle per Programmcode einem Feld zur Laufzeit zu?

    Vielleicht kennt jemand im Forum Beispielcode (per Link oder aus einem eigenen Projekt). Ich wäre dafür sehr dankbar.

    Gruß HorKar

    Dienstag, 28. Juli 2009 14:21

Antworten

  • Hallo,

    Für 1.) Füge dazu Deinem Projekt eine LINQ To SQL Element (DBML) hinzu.
    Für die Details solltest Du Dir anschauen Programmierhandbuch (LINQ to SQL)

    Um die Beispiele nachvollziehen zu können solltest Du SQL Server Express installiert haben
    und Dir die Northwind Beispieldatenbank installieren - auch wenn dort SQL Server 2000 steht
    funktioniert sie auch mit SQL Server 2005/2008 Express.

    Darüber hinaus zeigen 101 Visual Basic LINQ Samples viele Beispiele zum Umgang mit Linq
    in seine verschiedenen Ausprägungen.

    Linq To Sql ist aber nur eine von vielen Möglichkeiten, ebenso geht es mit DataSets.

    Zur TreeView-Klasse : Es unterstützt in Windows Forms als Standard-Steuerelement
    keine Datenbindung, so dass Du es via Code füllen mußt. Ein Basis-Bespiel findet sich dort.

    zu 2.) dabei reagierst Du auf das AfterSelect Ereignis. Um die unterschiedlichen Typen
    zu unterscheiden bietet sich eine Ableitung von TreeNode ab.

    Ein Beispiel kleines Beispiel das auf die Northwind Linq To Sql aufsetzt und aus einem
    TreeView und einem Button besteht:
    Public Class LinqTreeViewForm
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' Aktualisierung während des Füllen unterdrücken
            Me.TreeView1.BeginUpdate()
            Try
                ' Alle Knoten löschen
                TreeView1.Nodes.Clear()
    
                Using db As New NorthwindDataContext
                    ' Wählt alle Kunden in Deutschland aus.
                    Dim customerQuery = From c In db.Customers _
                        Where c.Country = "Germany" _
                        Select c
    
                    For Each customer In customerQuery
    
                        Dim customerID As String = customer.CustomerID
                        Dim companyName As String = customer.CompanyName
    
                        ' Wählt die (eindeutigen) Produkte des Kunden aus
                        Dim productQuery = (From p In db.Products _
                            Join od In db.OrderDetails On od.ProductID Equals p.ProductID _
                            Join o In db.Orders On od.OrderID Equals o.OrderID _
                            Where o.CustomerID = customerID _
                            Select p).Distinct
    
                        ' Erstellt einen Knoten für den Kunden 
                        Dim customerNode As TreeNode = New CustomersTreeNode(customer)
                        ' und fügt dort die Produkte als Unterkonten ein
                        For Each product In productQuery
                            customerNode.Nodes.Add(New ProductsTreeNode(product))
                        Next
                        Me.TreeView1.Nodes.Add(customerNode)
                    Next
                End Using
            Finally
                ' Aktualisierung der Ansicht
                Me.TreeView1.EndUpdate()
            End Try
        End Sub
    
        Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) _
            Handles TreeView1.AfterSelect
    
            ' Anhand des Knotentyps weitere Entscheidung treffen
            ' Anstatt MessageBox z. B. Anzeige eines UserControls mit Detaildaten
            If TypeOf e.Node Is CustomersTreeNode Then
                Dim node As CustomersTreeNode = DirectCast(e.Node, CustomersTreeNode)
                MessageBox.Show(String.Format( _
                    "Kunde {0} in {1} wurde ausgewählt", _
                    node.Customer.CompanyName, node.Customer.City))
            ElseIf TypeOf e.Node Is ProductsTreeNode Then
                Dim node As ProductsTreeNode = DirectCast(e.Node, ProductsTreeNode)
                MessageBox.Show(String.Format( _
                    "Product {0} mit Preis {1} wurde ausgewählt", _
                    node.Product.ProductName, node.Product.UnitPrice))
            End If
        End Sub
    
    #Region "CustomersTreeNode Class"
        ' Ableitung für Kunden
        Friend Class CustomersTreeNode
            Inherits TreeNode
            Friend Sub New(ByVal customer As Customers)
                Me.Customer = customer
    
                ' Für die Anzeige
                MyBase.Text = customer.CompanyName
            End Sub
    
            Private _customer As Customers
            Friend Property Customer() As Customers
                Get
                    Return Me._customer
                End Get
                Private Set(ByVal value As Customers)
                    Me._customer = value
                End Set
            End Property
        End Class
    #End Region
    
    #Region "ProductsTreeNode Class"
        Friend Class ProductsTreeNode
            Inherits TreeNode
    
            Friend Sub New(ByVal product As Products)
                Me.Product = product
    
                ' Für die Anzeige
                MyBase.Text = product.ProductName
            End Sub
    
            Private _product As Products
            Friend Property Product() As Products
                Get
                    Return Me._product
                End Get
                Private Set(ByVal value As Products)
                    Me._product = value
                End Set
            End Property
        End Class
    #End Region
    
    End Class
    Gruß Elmar



    Mittwoch, 29. Juli 2009 16:49
    Beantworter

Alle Antworten

  • Hallo,

    Für 1.) Füge dazu Deinem Projekt eine LINQ To SQL Element (DBML) hinzu.
    Für die Details solltest Du Dir anschauen Programmierhandbuch (LINQ to SQL)

    Um die Beispiele nachvollziehen zu können solltest Du SQL Server Express installiert haben
    und Dir die Northwind Beispieldatenbank installieren - auch wenn dort SQL Server 2000 steht
    funktioniert sie auch mit SQL Server 2005/2008 Express.

    Darüber hinaus zeigen 101 Visual Basic LINQ Samples viele Beispiele zum Umgang mit Linq
    in seine verschiedenen Ausprägungen.

    Linq To Sql ist aber nur eine von vielen Möglichkeiten, ebenso geht es mit DataSets.

    Zur TreeView-Klasse : Es unterstützt in Windows Forms als Standard-Steuerelement
    keine Datenbindung, so dass Du es via Code füllen mußt. Ein Basis-Bespiel findet sich dort.

    zu 2.) dabei reagierst Du auf das AfterSelect Ereignis. Um die unterschiedlichen Typen
    zu unterscheiden bietet sich eine Ableitung von TreeNode ab.

    Ein Beispiel kleines Beispiel das auf die Northwind Linq To Sql aufsetzt und aus einem
    TreeView und einem Button besteht:
    Public Class LinqTreeViewForm
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            ' Aktualisierung während des Füllen unterdrücken
            Me.TreeView1.BeginUpdate()
            Try
                ' Alle Knoten löschen
                TreeView1.Nodes.Clear()
    
                Using db As New NorthwindDataContext
                    ' Wählt alle Kunden in Deutschland aus.
                    Dim customerQuery = From c In db.Customers _
                        Where c.Country = "Germany" _
                        Select c
    
                    For Each customer In customerQuery
    
                        Dim customerID As String = customer.CustomerID
                        Dim companyName As String = customer.CompanyName
    
                        ' Wählt die (eindeutigen) Produkte des Kunden aus
                        Dim productQuery = (From p In db.Products _
                            Join od In db.OrderDetails On od.ProductID Equals p.ProductID _
                            Join o In db.Orders On od.OrderID Equals o.OrderID _
                            Where o.CustomerID = customerID _
                            Select p).Distinct
    
                        ' Erstellt einen Knoten für den Kunden 
                        Dim customerNode As TreeNode = New CustomersTreeNode(customer)
                        ' und fügt dort die Produkte als Unterkonten ein
                        For Each product In productQuery
                            customerNode.Nodes.Add(New ProductsTreeNode(product))
                        Next
                        Me.TreeView1.Nodes.Add(customerNode)
                    Next
                End Using
            Finally
                ' Aktualisierung der Ansicht
                Me.TreeView1.EndUpdate()
            End Try
        End Sub
    
        Private Sub TreeView1_AfterSelect(ByVal sender As System.Object, ByVal e As System.Windows.Forms.TreeViewEventArgs) _
            Handles TreeView1.AfterSelect
    
            ' Anhand des Knotentyps weitere Entscheidung treffen
            ' Anstatt MessageBox z. B. Anzeige eines UserControls mit Detaildaten
            If TypeOf e.Node Is CustomersTreeNode Then
                Dim node As CustomersTreeNode = DirectCast(e.Node, CustomersTreeNode)
                MessageBox.Show(String.Format( _
                    "Kunde {0} in {1} wurde ausgewählt", _
                    node.Customer.CompanyName, node.Customer.City))
            ElseIf TypeOf e.Node Is ProductsTreeNode Then
                Dim node As ProductsTreeNode = DirectCast(e.Node, ProductsTreeNode)
                MessageBox.Show(String.Format( _
                    "Product {0} mit Preis {1} wurde ausgewählt", _
                    node.Product.ProductName, node.Product.UnitPrice))
            End If
        End Sub
    
    #Region "CustomersTreeNode Class"
        ' Ableitung für Kunden
        Friend Class CustomersTreeNode
            Inherits TreeNode
            Friend Sub New(ByVal customer As Customers)
                Me.Customer = customer
    
                ' Für die Anzeige
                MyBase.Text = customer.CompanyName
            End Sub
    
            Private _customer As Customers
            Friend Property Customer() As Customers
                Get
                    Return Me._customer
                End Get
                Private Set(ByVal value As Customers)
                    Me._customer = value
                End Set
            End Property
        End Class
    #End Region
    
    #Region "ProductsTreeNode Class"
        Friend Class ProductsTreeNode
            Inherits TreeNode
    
            Friend Sub New(ByVal product As Products)
                Me.Product = product
    
                ' Für die Anzeige
                MyBase.Text = product.ProductName
            End Sub
    
            Private _product As Products
            Friend Property Product() As Products
                Get
                    Return Me._product
                End Get
                Private Set(ByVal value As Products)
                    Me._product = value
                End Set
            End Property
        End Class
    #End Region
    
    End Class
    Gruß Elmar



    Mittwoch, 29. Juli 2009 16:49
    Beantworter
  • Hallo HorKar,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.

    Grüße,
    Robert

    Dienstag, 25. August 2009 19:34
    Moderator