Ich weiß nicht, was Du unter "typisierten Tabellen" (s.o.) verstehst.
Ich nehme an, Du nutzt ein typisiertes Dataset.
In einem Dataset kannst Du geladene Tabellen
mit DataRelations verknüpfen (Fremdschlüssel).
Sie können auch im Dataset-Designer eingerichtet werden
Dann stehen Dir in den Tabellenzeilen "Childrows" zur Verfügung,
die Du direkt verwenden kannst, um eine hierarchische Knotenstruktur
daraus zu erstellen (geschachtelte Schleifenstruktur).
Ein einfaches Grundbeispiel (4 Tabellen, 3 Relations),
um die Vorgehensweise als Quellcode zu verdeutlichen:
Public Class frmDataset2Treeview
Dim ds As New DataSet
Dim trv As New TreeView With _
{.Parent = Me, .Dock = DockStyle.Fill}
Dim bs As New BindingSource
Private Sub CreateTableData(ByVal dt As DataTable)
'Hilfsfunktion
Const n As Integer = 20
dt.Columns.Add("ID", GetType(Integer))
dt.Columns.Add("Value", GetType(String))
dt.Columns.Add("Key", GetType(Integer))
dt.PrimaryKey = {dt.Columns(0)}
Dim rndm As New Random(123)
For i As Integer = 0 To n - 1
Dim row As DataRow = dt.NewRow
row(0) = i
row(2) = rndm.Next(0, n) 'Fremdschlüssel
row(1) = dt.TableName & "_Value_" & row(2).ToString
dt.Rows.Add(row)
Next i
End Sub
Private Sub frmDataset2Treeview_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
'Im Dataset: 4 Tabellen mit Daten erzeugen
For i As Integer = 1 To 4
ds.Tables.Add(New DataTable With _
{.TableName = "DT" & i.ToString})
CreateTableData(ds.Tables(i - 1))
Next i
'Tabellen verknüpfen / Datarelations erstellen
'In jeder Tabelle ist ID die Schlüssel-Spalte (0),
'Key die Fremdschlüssel-Spalte (2) und
'Value die im Treeview anzuzeigende Datenspalte (1)
For i As Integer = 0 To ds.Tables.Count - 2
Dim dr As New DataRelation _
(ds.Tables(i).TableName & ds.Tables(i + 1).TableName,
ds.Tables(i).Columns(0), ds.Tables(i + 1).Columns(2))
ds.Relations.Add(dr)
Next i
'Diverse Hilfsvariablen
'Treeview-Knoten gemäß Datarelations erstellen
Dim nd_i, nd_k, nd_l As TreeNode
'aktuelle Datarow (Referenz) in den Schleifen
Dim row_i, row_k, row_l, row_m As DataRow
'Name der Datarelation
Dim rel_i, rel_k, rel_l As String
'Tabellen-Index der im TRV anzuzeigenden Spalte
Dim col_i, col_k, col_l, col_m As Integer
'anzuzeigender Daten-Wert im Treeview
Dim val_i, val_k, val_l As String
For i As Integer = 0 To ds.Tables(0).Rows.Count - 1
row_i = ds.Tables(0).Rows(i)
col_i = 1
val_i = row_i(col_i).ToString
nd_i = GetNode(trv.Nodes, val_i)
rel_i = ds.Relations(0).RelationName
For k As Integer = 0 To _
row_i.GetChildRows(rel_i).Length - 1
row_k = row_i.GetChildRows(rel_i)(k)
col_k = 1
val_k = row_k(col_k).ToString
nd_k = GetNode(nd_i.Nodes, val_k)
rel_k = ds.Relations(1).RelationName
For l As Integer = 0 To _
row_k.GetChildRows(rel_k).Length - 1
row_l = row_k.GetChildRows(rel_k)(l)
col_l = 1
val_l = row_l(col_l).ToString
nd_l = GetNode(nd_k.Nodes, row_l(1).ToString)
rel_l = ds.Relations(2).RelationName
For m As Integer = 0 To _
row_l.GetChildRows(rel_l).Length - 1
row_m = row_l.GetChildRows(rel_l)(m)
col_m = 1
val_l = row_m(col_m).ToString
GetNode(nd_l.Nodes, val_l)
Next m
Next l
Next k
Next i
End Sub
Private Function GetNode(nodes As TreeNodeCollection, Key As String,
Optional ByVal text As String = "") As TreeNode
Dim ind As Integer = nodes.IndexOfKey(Key)
If ind >= 0 Then Return nodes(ind)
If String.IsNullOrWhiteSpace(text) Then text = Key
Return nodes.Add(Key, text)
End Function
End Class
Beitrag wurde zuletzt am 02.03.18 um 19:45:47 editiert. |