не уверен, как объяснить группу и подсчитать список элементов в datagridview - PullRequest
0 голосов
/ 21 мая 2018

Допустим, у меня есть DataGridView со следующими данными:

item1
item1
item2
item2
item2
item2
item3

В каком направлении я бы пошел, чтобы создать список из этих данных, подобный этому:

2 x item1
4 x item2
1 x item3

Это в основном говоритСколько раз элемент появлялся в списке и отображал количество раз и название элемента.

Считать строку 1, «item1» создать счетчик, прочитать каждый элемент в списке, когда строки совпадаютсчетчик приращений, переходите к следующему пункту, пропускайте уже подсчитанные элементы.

Это то, что я имею до сих пор, но это кажется слишком сложным.Есть ли способ сделать это более эффективно?

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 Ответ

0 голосов
/ 21 мая 2018

Если вы используете маленький 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, чтобы получить значение первой ячейки в каждой строке, а затем сгруппировать их.Получив эту коллекцию, вы получите доступ к свойствам Key и Count каждой записи, которые вы можете отображать любым способом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...