jreypalars Ответов: 2

Vb.net | как суммировать gridviewdata в другой gridviewdata


Привет всем, не могли бы вы помочь, суммировать данные в DGview1 в DGview2. вот мой столик.

Name	Hours
Name1	1
Name1	1
Name1	2
Name1	3
Name1	1
Name2	3
Name2	3
Name2	3


Ожидаемый результат:
Name	Hours
Name1	8
Name2	9


Что я уже пробовал:

Я использовал, например, цикл на первом, но не ожидаемом выходе.

For util As Integer = 0 To DataGridView1.RowCount - 2
        If DataGridView1.Rows(util).Cells(0).Value = "Name1" Then
        Dim totalUtil As Double
        totalUtil += Convert.ToDecimal(DataGridView1.Rows(util).Cells(5).Value)
        DataGridView4.Rows.Add(DataGridView1.Rows(util).Cells(0).Value, totalUtil)
        End If
        Next


Выход:
Name Hours
Name1 1
Name1 2
Name1 5
Name1 11
Name1 so on..
Name2 so on..

2 Ответов

Рейтинг:
1

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


Рейтинг:
1

Richard MacCutchan

Ваша логика несколько запутана, поскольку вы создаете новую итоговую переменную каждый раз, когда запись предназначена для "Name1", и добавляете это число (оригинал) в другую сетку. Это должно быть что-то вроде:

Dim totalUtil As Double
' this loop calculates the totals of all Name1 entries
For util As Integer = 0 To DataGridView1.RowCount - 2
    If DataGridView1.Rows(util).Cells(0).Value = "Name1" Then
        totalUtil += Convert.ToDecimal(DataGridView1.Rows(util).Cells(5).Value)
    End If
Next
' store the total value in the other DataGridView
DataGridView4.Rows.Add(DataGridView1.Rows(util).Cells(0).Value, totalUtil)