如何根据DataGridView复选框勾选状态求和指定列并显示到文本框
修复后的实现代码与说明
原代码存在的问题
- 求和变量
sum定义在循环内的if分支中,每次命中勾选行都会被重置为0,最终只能得到最后一条勾选行的重量,无法实现累加 - 列索引取值错误:DataGridView列索引从0开始计数,第三列Gross Weight对应的索引是2,原代码中
Cells[3]实际取的是第四列的值 - 结果赋值写在if分支内,若没有勾选行时文本框不会清空
- 类型转换逻辑不安全,遇到空行、空值时会直接抛出运行时异常
- 最终赋值对象错误,需求要求输出到
txtGW.Text,原代码错误赋值给了txtBKselect.Text
修复后的循环版本(兼容原有写法逻辑)
// 求和变量定义在循环外部 double sum = 0; for (int i = 0; i < datagridviewLog.Rows.Count; i++) { // 跳过新行模板行避免空值报错 if (datagridviewLog.Rows[i].IsNewRow) continue; // 直接转bool判断勾选状态,不需要转字符串对比 bool isChecked = (bool)datagridviewLog.Rows[i].Cells[0].Value; if (isChecked) { // 安全转换重量值,避免空值/格式错误报错 if (double.TryParse(datagridviewLog.Rows[i].Cells[2].Value?.ToString(), out double weight)) { sum += weight; } } } // 最终统一赋值给目标文本框,可根据需求调整小数保留格式 txtGW.Text = sum.ToString("F2");
可选简化版本(LINQ写法,代码更简洁)
double sum = datagridviewLog.Rows .Cast<DataGridViewRow>() .Where(r => !r.IsNewRow && (bool)r.Cells[0].Value) .Sum(r => double.TryParse(r.Cells[2].Value?.ToString(), out double w) ? w : 0); txtGW.Text = sum.ToString();
内容的提问来源于stack exchange,提问作者IsaacYt
相关产品推荐
相关产品推荐

