C#实现DataGridView单列求和显示到Label代码异常求解
DataGridView "Valor"列求和显示到Label的代码问题修复
原代码问题点
- 核心逻辑错误:未定义累加变量存储求和结果,循环内直接将每个单元格数值转字符串后拼接到Label文本上,最终得到的是数字拼接串而非求和结果。例如三行值为10、20、30时,输出为
102030而非正确结果60。 - 未过滤DataGridView的新增空行:控件开启
AllowUserToAddRows时,末尾会保留一行供用户新增记录的空白行,原逻辑未排除该行,容易触发无效值转换异常。 - 无转换容错:直接使用
Convert.ToDouble做类型转换,一旦单元格内容为非合法数字格式(如带货币符号的文本、空字符串残留),会直接抛出运行时错误。 - 冗余UI刷新:循环过程中反复修改Label的Text属性,属于不必要的性能消耗,应在求和完成后一次性赋值。
正确实现代码
首先确保项目已引用System.Linq命名空间,再使用如下逻辑:
// 初始化求和累加器 double subtotal = 0; // 遍历所有有效行:排除新增行、过滤Valor列为空的行 foreach (DataGridViewRow row in dgv_Carrinho.Rows.Cast<DataGridViewRow>() .Where(row => !row.IsNewRow && row.Cells["Valor"].Value != null)) { // 安全做数值转换,转换失败自动跳过避免崩溃 if (double.TryParse(row.Cells["Valor"].Value.ToString(), out double val)) { subtotal += val; } } // 求和完成后一次性给Label赋值,可按需指定显示格式,下方示例为保留2位小数带千分位 lbl_Subtotal.Text = subtotal.ToString("N2");
补充说明
如果"Valor"列存储的是带货币符号的格式化文本(如R$ 29.90这类带币种标识的内容),需要先替换掉非数字相关字符再做数值解析;更推荐的做法是DataGridView绑定数据源时直接存储数值类型,不要绑定格式化后的字符串,能从根源上避免转换错误。
内容的提问来源于stack exchange,提问作者codertocode
相关产品推荐
相关产品推荐

