vb.net - 根据特定条件计算 Datagridview 中的所有重复数据并将其放在图表上
vb.net - count all duplicates data in Datagridview for certain criteria and put it on a chart
所以基本上我要做的是计算某个“column8”中的重复值,避免 column17 中为“NO”的行。 table 会是这样的:
column8
column17
014
NO
014
013
NO
013
014
017
我的代码如下所示:
For Count As Integer = 0 To DataGridView1.Rows.Count - 1
If DataGridView1.Rows(Count).Cells("Column17").Value <> "NO" Then
Chart1.Series(0).Points.AddXY(DataGridView1.Item(8, Count).Value,
DataGridView1.Item(8, Count).Value)
End If
Next Count
它得到了名字,但计数根本没有意义。我需要的结果是带有第 8 列名称的图表,有多少重复不包括第 17 列中有“否”的那些。像这样:
014 2
013 1
017 1
非常感谢您的帮助。谢谢!
您可以使用 LINQ 执行以下操作:
- 查询 DataGridViewRows
- Row 不为空,不是新行,并且相应的 Column17 值不是“NO”
- 按 Column8 值分组
- Return 第一组的 Column8 值以及计数
这将为您提供唯一值和所需的计数。例如:
Dim chartValues = From row In DataGridView1.Rows.OfType(Of DataGridViewRow)
Where
row IsNot Nothing AndAlso
Not row.IsNewRow AndAlso
Not row.Cells().Item("Column17").Value.Equals("NO")
Group By row.Cells().Item("Column8").Value Into rowGroup = Group
Order By rowGroup.Count() Descending
Select New With {
.Value = rowGroup.First().Cells("Column8").Value.ToString(),
.Count = rowGroup.Count()
}
我对图表控件不够熟悉,无法为您提供一个有把握的示例,但我认为您会以这种方式添加数据:
For Each chartValue In chartValues
Chart1.Series(0).Points.AddXY(chartValue.Value, chartValue.Count)
Next
更新
根据 OP 的要求,这里是上述代码的 non-LINQ 版本 (sans-sort)
Dim chartValues = New Dictionary(Of String, Integer)()
For Each row In DataGridView1.Rows.OfType(Of DataGridViewRow)
If (row Is Nothing OrElse row.IsNewRow OrElse row.Cells().Item("Column17").Value.Equals("NO")) Then
Continue For
End If
Dim column8Value = row.Cells().Item("Column8").Value.ToString()
If (chartValues.ContainsKey(column8Value)) Then
chartValues(column8Value) += 1
Else
chartValues.Add(column8Value, 1)
End If
Next
所以基本上我要做的是计算某个“column8”中的重复值,避免 column17 中为“NO”的行。 table 会是这样的:
column8 | column17 |
---|---|
014 | NO |
014 | |
013 | NO |
013 | |
014 | |
017 |
我的代码如下所示:
For Count As Integer = 0 To DataGridView1.Rows.Count - 1
If DataGridView1.Rows(Count).Cells("Column17").Value <> "NO" Then
Chart1.Series(0).Points.AddXY(DataGridView1.Item(8, Count).Value,
DataGridView1.Item(8, Count).Value)
End If
Next Count
它得到了名字,但计数根本没有意义。我需要的结果是带有第 8 列名称的图表,有多少重复不包括第 17 列中有“否”的那些。像这样:
014 2
013 1
017 1
非常感谢您的帮助。谢谢!
您可以使用 LINQ 执行以下操作:
- 查询 DataGridViewRows
- Row 不为空,不是新行,并且相应的 Column17 值不是“NO”
- 按 Column8 值分组
- Return 第一组的 Column8 值以及计数
这将为您提供唯一值和所需的计数。例如:
Dim chartValues = From row In DataGridView1.Rows.OfType(Of DataGridViewRow)
Where
row IsNot Nothing AndAlso
Not row.IsNewRow AndAlso
Not row.Cells().Item("Column17").Value.Equals("NO")
Group By row.Cells().Item("Column8").Value Into rowGroup = Group
Order By rowGroup.Count() Descending
Select New With {
.Value = rowGroup.First().Cells("Column8").Value.ToString(),
.Count = rowGroup.Count()
}
我对图表控件不够熟悉,无法为您提供一个有把握的示例,但我认为您会以这种方式添加数据:
For Each chartValue In chartValues
Chart1.Series(0).Points.AddXY(chartValue.Value, chartValue.Count)
Next
更新
根据 OP 的要求,这里是上述代码的 non-LINQ 版本 (sans-sort)
Dim chartValues = New Dictionary(Of String, Integer)()
For Each row In DataGridView1.Rows.OfType(Of DataGridViewRow)
If (row Is Nothing OrElse row.IsNewRow OrElse row.Cells().Item("Column17").Value.Equals("NO")) Then
Continue For
End If
Dim column8Value = row.Cells().Item("Column8").Value.ToString()
If (chartValues.ContainsKey(column8Value)) Then
chartValues(column8Value) += 1
Else
chartValues.Add(column8Value, 1)
End If
Next