Benutzer mit den meisten Antworten
VB: Treeview aus Datenbank füllen

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
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
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 25. August 2009 19:35
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
- Als Antwort markiert Robert BreitenhoferModerator Dienstag, 25. August 2009 19:35