我正在制作一个应用程序,我想添加按品牌分类的SUBTOTAL列的值( BRAND列),问题是品牌会有所不同。在第一种情况下,它只占用了两个标记,并用这段代码解决了问题......
Sub Sumar()
Dim totalA As Double = 0
Dim totalB As Double = 0
For Each fila As DataGridViewRow In dgvDatos.Rows
If fila.Cells("SUBTOTAL").Value Is Nothing Then
Exit Sub
ElseIf fila.Cells("MARCA").Value = "A" Then
totalA += Convert.ToDouble(fila.Cells("SUBTOTAL").Value)
ElseIf fila.Cells("MARCA").Value = "B" Then
totalB += Convert.ToDouble(fila.Cells("SUBTOTAL").Value)
End If
Next
lblA.Text = Format(totalA, "$ #,##0.000")
lblB.Text = Format(totalB, "$ #,##0.000")
End Sub
但是现在标记可以是变量,而我处理它的方式我必须声明 N 个变量来存储每个标记的结果。有什么建议可以优化我的操作吗?
提前致谢!!
您可以使用称为控制切割的算法。在我留给你的这个链接中,他们以一种简单的方式定义它:
“控制切割是一个过程,其中从一个或多个字段的值排序的记录开始,(称为关键字段或键或排序标准)它们按排序标准确定的类别进行处理。换句话说,有序集的记录被处理成由订单标准确定的子集。”
在您的情况下,您应该首先按 BRAND 对 dgvDatos 表进行排序,以便将此属性用作分类器。以下是如何开始修改代码(我对 vb 了解不多,所以不要将此示例作为解决方案):
这样,第一步对表进行排序,您将拥有属于 MARK 'A' 的所有行,然后是下一个 MARK 的所有行,依此类推。算法将属于第一个品牌的所有 SUBTOTALS 相加,直到找到不同的,然后将品牌变量设置为新品牌(第一个定义之后的那个,即“A”)以重新开始整个过程.
它使用字典,不需要对数据进行排序。
在您进行总和的代码中:
我是凭记忆做的,我手头没有视觉工作室来测试
如果您的 Datagridview 与 DataTable (dgvDatos.DataSource = TablaDgvDatos) 相关联,则可以使用 DataTable 的 Compute 方法。
如果这些标记会随着时间的推移而变化,并且您的意思是在有新标记时不必修改代码,例如,请指定您如何阅读要添加的标记以提出解决方案。
如果数据集在数据库中,您可以使用以下命令
SELECT
为您提供所需的内容:显示此结果的最佳方式是另一个网格,但它的优点是,无论您拥有多少标记,它都会起作用。
您可以创建存储过程,也可以启动对数据库的查询执行。