Ich nehme an, die Daten werden in Dataset/Datatable geladen.
Hier ein Beispiel zur Umsetzung von Spaltenwerten (Strings) aus
Datarows in eine Treeview-Knotenhierarchie.
Public Class FrmDatatable2Treeview
Dim dt As New DataTable
Dim bs As New BindingSource
Dim dgv As New DataGridView With
{.Parent = Me, .Width = 300, .DataSource = bs}
Dim trv As New TreeView With
{.Parent = Me, .Left = 310, .Width = 300, .Scrollable = True}
Private Sub FrmDatatable2Treeview_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Me.Size = New Size(630, 300)
'Testdaten
With dt
With .Columns
.Add("Menge", GetType(Integer))
.Add("Material") : .Add("Händler") : .Add("Qualität")
.Add("Status")
End With
With .Rows
.Add(20, "Holz", "Meyer", "Premium", "lagernd")
.Add(40, "Kohlen", "Schulz", "Bruch", "bestellt")
.Add(45, "Kohlen", "schulz", "Bruch", "bestellt")
.Add(12, "Koks", "Schneider", "Bruch", "lagernd")
.Add(10, "Holz", "Meyer", "Medium", "lagernd")
.Add(15, "Kohlen", "Schulz", "Premium", "geliefert")
.Add(20, "Propan", "Meyer", "Premium", "geliefert")
.Add(5, "Propan", "Schulz", "Medium", "bestellt")
.Add(10, "Holz", "Schulz", "Bruch", "lagernd")
.Add(30, "Kohlen", "Müller", "Medium", "")
.Add(20, "Kohlen", "Müller", "Bruch", "")
.Add(200, "Koks", "Müller", "Bruch", "lagernd")
End With
End With
bs.DataSource = dt 'Datenbindung
'Sortieren der Datenspalten: Festlegung der Knotenfolge im Treeview
bs.Sort = "Händler DESC, Material, Qualität"
'Übertragung von Spaltenwerten ins Treeview (Knoten-Hierarchie):
'Händler(2), Material(1), Qualität(3), Menge(0)
DatatableColumns2Treeview(bs, New Integer() {2, 1, 3, 0}, trv)
End Sub
Private Function DatatableColumns2Treeview(ByVal bs As BindingSource, _
ByVal columnindices() As Integer, _
trv As TreeView) As Boolean
If bs Is Nothing Or trv Is Nothing Then Return False
If bs.DataSource Is Nothing Then Return False
If Not TypeOf bs.DataSource Is DataTable Then Return False
'Spaltenindices prüfen
If columnindices Is Nothing OrElse
columnindices.Length < 2 Then Return False
For i As Integer = 0 To columnindices.Length - 1
If columnindices(i) < 0 Or
columnindices(i) > dt.Columns.Count - 1 Then Return False
Next i
trv.Nodes.Clear()
Try
'Zeilen in der Datatable durchlaufen
For r As Integer = 0 To bs.Count - 1
Dim row As DataRow = DirectCast(bs(r), DataRowView).Row
'Knoten-Pfad aus Spaltenwerten zusammensetzen
Dim path As String = ""
For i As Integer = 0 To columnindices.Length - 1
path &= row(columnindices(i)).ToString
If i < columnindices.Length - 1 Then path &= _
trv.PathSeparator
Next i
GetTreeNodeByPath(trv.Nodes, path)
Next r
Return True
Catch
Return False
End Try
End Function
''' <summary>In der Collection wird ein Pfad-Knoten ermittelt/erstellt</summary>
''' <param name="Nodes">Node-Collection</param>
''' <param name="path">zu suchender/zu erstellender Pfad</param>
''' <returns>Treenode</returns>
Private Function GetTreeNodeByPath(ByVal Nodes As TreeNodeCollection, _
path As String) As TreeNode
Dim parts() As String =
path.Split({trv.PathSeparator}, StringSplitOptions.None)
Dim nd As TreeNode, ind As Integer, c As Integer = -1
'Pfad durchlaufen
Do
c += 1
ind = Nodes.IndexOfKey(parts(c))
If ind = -1 Then
'Pfad-Knoten fehlt in Auflistung, wird erstellt
nd = Nodes.Add(parts(c), parts(c))
Else
nd = Nodes(parts(c))
End If
Nodes = nd.Nodes
Loop While c < parts.Length - 1
Return nd
End Function
End Class
Beitrag wurde zuletzt am 01.03.18 um 06:17:57 editiert. |