小計行はグルーピングごとに差し込まねばならないので、今回は イテレーターを使って For Each の合間に Yield する実装にしてみました。
''' <summary> ''' List(Of ) に対する小計サンプル ''' </summary> Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim source As New List(Of Tuple(Of String, String, Integer))() source.Add(Tuple.Create("aaa", "bbb", 10)) source.Add(Tuple.Create("aaa", "bbb", 20)) source.Add(Tuple.Create("bbb", "aaa", 10)) source.Add(Tuple.Create("bbb", "aaa", 20))
DataGridView1.DataSource = source
Dim sample = Iterator Function() For Each subTotal In From g In source Group By g.Item1 Into Sum(g.Item3), Group For Each details In subTotal.Group Yield details Next Yield Tuple.Create($"{subTotal.Item1}の小計", "", subTotal.Sum) Next If source.Any() Then Yield Tuple.Create("総合計", "", Aggregate r In source Into Sum(r.Item3)) End If End Function
DataGridView2.DataSource = sample().ToArray() End Sub
''' <summary> ''' DataTable に対する小計サンプル ''' </summary> Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Dim source As New DataTable() source.Columns.Add("Item1", GetType(String)) source.Columns.Add("Item2", GetType(String)) source.Columns.Add("Item3", GetType(Integer))
Dim sample = Iterator Function() For Each subTotal In From g In source Group By Item1 = g.Field(Of String)("Item1") Into Sum(g.Field(Of Integer)("Item3")), Group For Each details In subTotal.Group Yield details Next Dim subTotalRow = source.NewRow() subTotalRow("Item1") = $"{subTotal.Item1}の小計" subTotalRow("Item3") = subTotal.Sum Yield subTotalRow Next If source.Rows.Count > 0 Then Dim totalRow = source.NewRow() totalRow("Item1") = "総合計" totalRow("Item3") = Aggregate r In source Into Sum(r.Field(Of Integer)("Item3")) Yield totalRow End If End Function
DataGridView2.DataSource = sample().CopyToDataTable() End Sub