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
相关产品推荐
相关产品推荐

