You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

关键注意事项

  1. 列索引调整:一定要把代码中的row.Cells(2).Value的索引2替换成你DataGridView中类别列的实际索引(列索引从0开始,比如类别是第1列就用0)。
  2. 结果展示控件:示例中用lblCategoryTotals这个Label展示分类统计结果,你需要先在窗体上添加这个控件,或者换成其他控件(比如另一个DataGridView来展示分类统计会更美观)。
  3. 实时更新:如果你的DataGridView允许用户直接编辑价格或类别,记得保留CellValueChanged事件,这样用户修改内容后统计结果会自动更新。

内容的提问来源于stack exchange,提问作者Sheng Wong

火山引擎 最新活动