不确定如何解释datagridview中的组和计数项列表

时间:2018-05-21 18:40:29

标签: vb.net datagridview

假设我有一个包含以下数据的DataGridView:

2 x item1
4 x item2
1 x item3

我将从该数据中创建这样的列表的方向:

Dim counter = 0
    Dim listbox As New ListBox 'to store items already scanned
    listbox.Items.Clear() 'clear it on each new call
    listbox.Items.Add("Test") ' add a dummy value to start the loop
    For Each row In DataGridView1.Rows 'check each item in the datagridview

        Dim ItemName = row.Cells(1).Value 'declare the initial itemName
        Dim flag = True'set the continue bool to true
        For Each LoggedItem In listbox.Items 'check each item in the listbox to see if it has been check already 
            If LoggedItem = ItemName Then
                flag = False 'if the item has been checked set the continue bool flag to false to prevent it from adding and displaying the item again
            End If

        Next 'check next item in listbox 
        If flag Then

            counter = 0 'reset item counter
            For Each row2 In DataGridView1.Rows
                Dim ItemName2 = row2.Cells(1).Value
                If ItemName = ItemName2 Then
                    counter += 1 'checks each item in the datagridview again and counts how many matches it finds
                End If
            Next

            listbox.Items.Add(ItemName) 'add scanned item to the already checked list
            MsgBox(counter & " x " & ItemName) 'display item totals

        End If
        flag = True 'reset flag for next item
    Next  'continuum to next item

它基本上说明了一个项目出现在列表中的次数,并显示了项目的次数和名称。

阅读第1行,"第1项和第34期;创建计数器,读取列表中的每个项目,当字符串匹配增量计数器时,转到下一个项目跳过已经计数的项目。

这是我到目前为止所做的,但似乎有点过于复杂。有没有办法更有效地做到这一点?

nu[1]

1 个答案:

答案 0 :(得分:2)

如果你使用一点linq,你可以在一行中完成大部分工作。通过使用linq分组的可枚举集合,您可以获得不同的值列表及其计数,然后输出您喜欢的结果。这是一个winforms示例,您可以将其粘贴到新项目中以开始使用:

  

我用来设置测试的代码:

'Create DataGridView and add it to the form
Dim dgv As New DataGridView With {
    .Location = New Point(50, 50),
    .Size = New Size(150, 300),
    .AllowUserToAddRows = False
}
dgv.Columns.Add("Column1", "Column 1")
Me.Controls.Add(dgv)

'Put some test data in it
Dim testValues As String() = {"item1", "item1", "item2", "item2", "item2", "item2", "item3"}
For Each testValue As String In testValues
    dgv.Rows.Add(New String() {testValue})
Next
  

获取不同的值及其数量:

'Now to the question at hand...
Dim column1GroupedValues = dgv.Rows.OfType(Of DataGridViewRow).Select(Function(row) row.Cells(0).Value.ToString()).GroupBy(Function(x) x)
Dim outputString As New System.Text.StringBuilder
For Each grpVal In column1GroupedValues
    outputString.Append(String.Format("{0} x {1}" & vbCrLf, grpVal.Count.ToString, grpVal.Key))
Next
MsgBox(outputString.ToString)

'Outputs:
'2 x item1
'4 x item2
'1 x item3

神奇的一切都发生在我们创建column1GroupedValues的地方。我们告诉linq获取每行中第一个单元格的值,然后对它们进行分组。拥有该集合后,您就可以访问每个条目的KeyCount媒体资源,您可以按照自己需要的方式展示这些资源。