VB.NET DataGridView按类别计算商品价格的实现代码咨询
在VB.NET中实现DataGridView的按类别商品价格计算
嘿,我看你已经搞定了购物车总价格的计算,现在要实现按类别统计商品价格的话,咱们可以借助字典来跟踪每个类别的累计金额,这样就能轻松实现分类统计,而且还能保证统计结果在商品增删改时实时更新。下面是具体的实现方案:
核心思路
用Dictionary(Of String, Double)来存储每个类别的总价(键为类别名称,值为该类别累计金额),遍历DataGridView的每一行完成统计,最后把结果展示出来。我们会把统计逻辑封装成一个通用方法,方便在页面加载、商品删除、清空购物车等场景下调用。
修改后的完整代码
Public Class OrderCart Private Sub OrderCart_Load(sender As Object, e As EventArgs) Handles MyBase.Load Me.WindowState = FormWindowState.Maximized ' 页面加载时计算价格(包括分类统计和总价格) CalculatePrices() End Sub ' 通用价格计算方法:计算总价格+按类别统计价格 Private Sub CalculatePrices() ' 字典存储每个类别的累计总价 Dim categoryTotals As New Dictionary(Of String, Double)() Dim totalPrice As Double = 0 ' 遍历DataGridView的每一行 For Each row As DataGridViewRow In dgvCart.Rows ' 跳过自动生成的新行(如果开启了允许添加新行的话) If row.IsNewRow Then Continue For ' 替换成你实际的列索引:这里假设第3列是类别(索引2),第6列是行总价(索引5) Dim category As String = Convert.ToString(row.Cells(2).Value) Dim rowPrice As Double = Convert.ToDouble(row.Cells(5).Value) ' 累计总价格 totalPrice += rowPrice ' 更新类别总价:存在则累加,不存在则新增 If categoryTotals.ContainsKey(category) Then categoryTotals(category) += rowPrice Else categoryTotals(category) = rowPrice End If Next ' 更新总价格标签(保留你原有的格式) lblTotalPriceOutput.Text = FormatCurrency(totalPrice) ' 展示分类统计结果:这里示例用一个Label(需要你先在窗体上添加名为lblCategoryTotals的Label) Dim categoryStats As New StringBuilder() categoryStats.AppendLine("按类别统计:") For Each kvp As KeyValuePair(Of String, Double) In categoryTotals categoryStats.AppendLine($"- {kvp.Key}: {FormatCurrency(kvp.Value)}") Next lblCategoryTotals.Text = categoryStats.ToString() End Sub Private Sub btnBack_Click(sender As Object, e As EventArgs) Handles btnBackToHome.Click Home.Show() End Sub Private Sub btnCheckout_Click(sender As Object, e As EventArgs) Handles btnCheckout.Click Payment.Show() End Sub Private Sub btnRemove_Click(sender As Object, e As EventArgs) Handles btnRemove.Click Dim i As Integer If (dgvCart.RowCount <= 0) Then MessageBox.Show("No item is selected!", "Remove Item", MessageBoxButtons.OK, MessageBoxIcon.Error) Else i = dgvCart.CurrentCell.RowIndex dgvCart.Rows.RemoveAt(i) ' 删除商品后更新统计 CalculatePrices() End If End Sub Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click dgvCart.Rows.Clear() ' 清空购物车后更新统计 CalculatePrices() End Sub ' 可选:如果允许用户编辑单元格内容,添加此事件保证统计实时更新 Private Sub dgvCart_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles dgvCart.CellValueChanged ' 排除无效行索引和新行 If e.RowIndex < 0 OrElse dgvCart.Rows(e.RowIndex).IsNewRow Then Return ' 单元格值变化时重新计算 CalculatePrices() End Sub End Class
关键注意事项
- 列索引调整:一定要把代码中的
row.Cells(2).Value的索引2替换成你DataGridView中类别列的实际索引(列索引从0开始,比如类别是第1列就用0)。 - 结果展示控件:示例中用
lblCategoryTotals这个Label展示分类统计结果,你需要先在窗体上添加这个控件,或者换成其他控件(比如另一个DataGridView来展示分类统计会更美观)。 - 实时更新:如果你的DataGridView允许用户直接编辑价格或类别,记得保留
CellValueChanged事件,这样用户修改内容后统计结果会自动更新。
内容的提问来源于stack exchange,提问作者Sheng Wong




