Was genau Du erreichen möchtest, kann ich nicht erkennen.
Hier ein Beispiel mit drei verknüpften Tabellen,
wobei die Spalten der ersten beiden Tabellen in eine
Knotenhierarchie (Treeview) eingetragen werden und das Array
der jeweils zugehörigen Childrows der dritten Tabelle in die
TAG-Eigenschaft des Knotens der Spalte der zweiten Tabelle
eingetragen wird.
Beim Click auf einen Knoten der zweiten Hierarchie-Ebene
wird das Datagridview mit den, per Datarelation ermittelten,
Spalten der dritten Tabelle gefüllt (falls Sätze vorhanden sind).
Public Class FrmDataRelations2Controls
Dim ds As New DataSet
Dim WithEvents trv As New TreeView With
{.Parent = Me, .Width = 300}
Dim dgv As New DataGridView With
{.Parent = Me, .Left = 310, .AllowUserToAddRows = False}
Dim dtx As New DataTable 'für Grid-Anzeige der letzten Tabelle
Private Sub CreateTableData(ByVal dt As DataTable,
Optional ByVal n As Integer = 100)
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_" & _
i.ToString & "/" & row(2).ToString
dt.Rows.Add(row)
Next i
End Sub
Private Sub FrmDataRelations2Controls_Load(sender As Object,
e As EventArgs) Handles MyBase.Load
Me.Size = New Size(620, 300)
Me.FormBorderStyle = FormBorderStyle.Fixed3D
'Im Dataset: 3 Tabellen mit Daten erzeugen
For i As Integer = 1 To 3
ds.Tables.Add(New DataTable With {.TableName = "DT" & i.ToString})
CreateTableData(ds.Tables(i - 1))
Next i
'Tabellen verknüpfen / Datarelations erstellen
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
'Treeview-Knoten gemäß Datarelations erstellen
Dim nd_i, nd_k As TreeNode
Dim row_i, row_k As DataRow 'aktuelle Datarow in Schleife
Dim rel_i, rel_k As String 'Name der Datarelation
Dim col_i, col_k As Integer 'Index der anzuzeigenden Spalte im Treeview
Dim val_i, val_k As String 'anzuzeigender Daten-Wert im Treeview
dtx = ds.Tables(2).Clone
dgv.DataSource = dtx
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
'Speichern einer Referenz des Childrows-Array im Knoten
nd_k.Tag = row_k.GetChildRows(rel_k)
Next k
Next i
End Sub
Private Sub Trv_NodeMouseClick(sender As Object,
e As TreeNodeMouseClickEventArgs) Handles trv.NodeMouseClick
dtx.Clear()
'Level = 1: zweite Knotenebene
If e.Node.Level = 1 Then
Dim rows As DataRow() = DirectCast(e.Node.Tag, DataRow())
For i As Integer = 0 To rows.Length - 1
dtx.Rows.Add(rows(i).ItemArray)
Next i
End If
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 04.03.18 um 08:33:57 editiert. |