You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DataGridView总计计算异常:插入小计后重复计算问题求助

问题解决:DataGridView插入小计行重复计算的修复

核心问题

你的代码每次点击求和时,会遍历所有行(包括之前已经插入的小计行)进行累加,导致小计被重复计入总和,结果异常。

修复方案

给小计行添加标记,求和时跳过这些标记行,只计算原始数据行:

修改后的代码:

Private Sub BtnSum_Click(sender As Object, e As EventArgs) Handles BtnSum.Click
    Dim somme As Double = 0
    ' 遍历所有行,只累加非小计行的数值
    For x As Integer = 0 To DgvDevisClent.Rows.Count - 1
        ' 跳过新行(如果DataGridView允许添加新行)和标记为小计的行
        If Not DgvDevisClent.Rows(x).IsNewRow AndAlso DgvDevisClent.Rows(x).Tag IsNot "SubTotal" Then
            ' 先判断单元格值是否有效,避免转换错误
            If Double.TryParse(DgvDevisClent.Rows(x).Cells(4).Value?.ToString(), Nothing) Then
                somme += CDbl(DgvDevisClent.Rows(x).Cells(4).Value)
            End If
        End If
    Next

    ' 格式化数值,直接保留三位小数
    Dim formattedSum As String = String.Format("{0:##,##0.000}", somme)
    
    ' 插入小计行
    Dim insertIndex As Integer = DgvDevisClent.CurrentRow.Index + 1
    DgvDevisClent.Rows.Insert(insertIndex, 1)
    Dim subTotalRow = DgvDevisClent.Rows(insertIndex)
    
    ' 标记该行是小计行,方便下次求和时跳过
    subTotalRow.Tag = "SubTotal"
    ' 设置小计值
    subTotalRow.Cells(4).Value = formattedSum
    ' 可选:给小计行设置不同样式,方便区分
    subTotalRow.DefaultCellStyle.BackColor = Color.LightGray
    
    DgvDevisClent.CurrentCell = subTotalRow.Cells(0)
    DgvDevisClent.Focus()
End Sub

关键改进点

  • 跳过小计行:通过Row.Tag标记小计行,求和时只处理未标记的原始数据行。
  • 避免转换错误:用Double.TryParse判断单元格值是否为有效数字,防止空值或非数值导致崩溃。
  • 简化数值格式化:直接对Double类型的somme格式化,去掉多余的字符串转Double操作。
  • 可选样式区分:给小计行设置背景色,让用户直观区分数据行和小计行。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 05:45:08