Maciej Los
С помощью В LINQ[^]...
Предполагая, что ваш DataGridView1
контроль-это привязка с помощью DataTable
объект, вы можете создать другой объект datatable и заполнить его сгруппированными данными. Например:
'for test purposes only
'Dim dt As DataTable = New DataTable()
'dt.Columns.Add(New DataColumn("Name", Type.GetType("System.String")))
'dt.Columns.Add(New DataColumn("Hours", Type.GetType("System.Int32")))
'dt.Rows.Add(New Object(){"Name1", 1})
'dt.Rows.Add(New Object(){"Name1", 1})
'dt.Rows.Add(New Object(){"Name1", 2})
'dt.Rows.Add(New Object(){"Name1", 3})
'dt.Rows.Add(New Object(){"Name1", 1})
'dt.Rows.Add(New Object(){"Name2", 3})
'dt.Rows.Add(New Object(){"Name2", 3})
'dt.Rows.Add(New Object(){"Name2", 3})
'get datatable object
Dim dt As DataTable = DirectCast(DataGridView1.DataSource, DataTable)
'create a datasource for DataGridView2
Dim dt2 As DataTable = dt.Clone()
'fill-in a datatable object
dt2 = dt.AsEnumerable() _
.GroupBy(Function(x) x.Field(Of String)("Name")) _
.Select(Function(grp) dt2.LoadDataRow( New Object(){ _
grp.Key, _
grp.Sum(Function(x) x.Field(Of Integer)("Hours")) _
}, False)) _
.CopyToDataTable()
'bind data
DataGridView2.DataSource = dt2
Если у вас есть неограниченный элемент управления DataGridView, вы можете работать со строками DataGridView:
Dim result = dgv.Rows.Cast(Of DataGridViewRow)() _
.GroupBy(Function(x) x.Cells(0).Value) _
.Select(Function(grp) New With _
{
.Name = grp.Key, _
.Hours = grp.Sum(Function(x) x.Cells(1).Value) _
}) _
.ToList()
DataGridView2.DataSource = result