Das geht einfacher z.B. über eine Datarelation und
LINQ-Aggregate. Simples Beispiel:
Public Class frmSummationDemo
'Dataset, Tabellen, Relation
Dim ds As New DataSet
Dim dtparent As New DataTable("Parent")
Dim WithEvents dtchild As New DataTable("Child")
Dim rel As DataRelation
'Datagridviews
Dim dgvParent As New DataGridView With _
{.Parent = Me, .Width = 200}
Dim dgvChild As New DataGridView With _
{.Parent = Me, .Width = 200, .Left = 210}
Private Sub frmSummationDemo_Load(sender As System.Object, _
e As System.EventArgs) Handles MyBase.Load
'Füllen des Dataset mit Testspalten und einer Relation
With dtparent
.Columns.Add("SatzID", GetType(Integer))
.Columns.Add("Summe", GetType(Integer))
.PrimaryKey = New DataColumn() {.Columns("SatzID")}
.Rows.Add(1, 0)
.Rows.Add(2, 0)
.Rows.Add(3, 0)
End With
With dtchild
.Columns.Add("SatzID", GetType(Integer))
.Columns("SatzID").DefaultValue = 1
.Columns.Add("Menge", GetType(Double))
.Columns("Menge").DefaultValue = 0
End With
With ds
.Tables.Add(dtparent) : .Tables.Add(dtchild)
'Erstellung der Relation
.Relations.Add(New DataRelation("SatzID", _
dtparent.Columns("SatzID"), dtchild.Columns("SatzID")))
End With
'Datenbindung
dgvChild.DataSource = dtchild
dgvParent.DataSource = dtparent
End Sub
Private Sub dtchild_RowChanged(sender As Object, _
e As System.Data.DataRowChangeEventArgs) _
Handles dtchild.RowChanged
'Parentrow anhand der Relation für aktuell geänderte Zeile
Dim parentrow As DataRow = e.Row.GetParentRow("SatzID")
If parentrow Is Nothing Then Exit Sub
'Alle Childrows zu der Parentrow ermitteln
Dim rows() As DataRow = parentrow.GetChildRows("SatzID")
'Childrows aggregieren: Summe
parentrow("Summe") = Aggregate r As DataRow In rows _
Into Sum(CDbl(r("Menge").ToString))
'Alternative (beim Wechsel des SatzID im Childsatz)
With dtparent
For i As Integer = 0 To .Rows.Count - 1
Dim ch_rows() As DataRow = .Rows(i).GetChildRows("SatzID")
.Rows(i)("Summe") = Aggregate r As DataRow In ch_rows _
Into Sum(CDbl(r("Menge").ToString))
Next i
End With
End Class
Beitrag wurde zuletzt am 29.01.14 um 00:10:08 editiert. |