DataGridView自动计算需求及现有代码故障求助
问题修复方案
你的代码核心问题:
- 条件判断逻辑错误:
e.ColumnIndex.Equals(4) && e.ColumnIndex.Equals(5) && e.ColumnIndex.Equals(8)使用了逻辑与,一个列索引不可能同时等于三个值,必须换成逻辑或||,只要修改的是Quantity、UnitPrice、GST其中一列就触发计算。 - 未处理空值:如果单元格未填值,
Convert.ToDouble会直接抛出异常,需要先判断值的有效性。 - 缺少总计(Grand Total)的计算逻辑。
修正后的完整代码:
1. 修改单元格值变更事件处理
private void dataGridView1_CellValueChanged_1(object sender, DataGridViewCellEventArgs e) { // 检查是否是Quantity、UnitPrice、GST列(对应索引4、5、8) if (e.ColumnIndex == 4 || e.ColumnIndex == 5 || e.ColumnIndex == 8) { var targetRow = dataGridView1.Rows[e.RowIndex]; // 尝试解析三个单元格的值,避免空值或非数字导致的报错 if (double.TryParse(targetRow.Cells["Quantity"].Value?.ToString(), out double quantity) && double.TryParse(targetRow.Cells["UnitPrice"].Value?.ToString(), out double unitPrice) && double.TryParse(targetRow.Cells["GST"].Value?.ToString(), out double gst)) { // 按公式计算行合计:(数量*单价)*GST百分比 double rowTotal = (quantity * unitPrice) * gst; targetRow.Cells["Total"].Value = rowTotal.ToString("F2"); // 保留两位小数更符合财务场景 } else { // 任一值为空时,清空该行合计 targetRow.Cells["Total"].Value = string.Empty; } // 行合计更新后立即刷新总计 CalculateGrandTotal(); } }
2. 添加总计计算方法
private void CalculateGrandTotal() { double grandTotal = 0; foreach (DataGridViewRow row in dataGridView1.Rows) { // 跳过DataGridView默认的新行(如果允许用户新增行) if (row.IsNewRow) continue; // 累加有效行的合计值 if (double.TryParse(row.Cells["Total"].Value?.ToString(), out double rowTotal)) { grandTotal += rowTotal; } } // 假设你用labelGrandTotal控件显示总计,可根据实际控件调整 labelGrandTotal.Text = $"总计: {grandTotal.ToString("F2")}"; }
额外提示:
- 确保DataGridView的列名("Quantity"、"UnitPrice"、"GST"、"Total")和代码中完全一致,否则会出现找不到列的错误。
- 如果GST是百分比形式(比如输入10代表10%),需要把计算公式改成
(quantity * unitPrice) * (gst / 100),根据实际业务需求调整。 - 可以在
DataGridView.DataBindingComplete事件中调用CalculateGrandTotal(),确保初始加载数据时总计显示正确。
内容的提问来源于stack exchange,提问作者Mohd Sameer
相关产品推荐
相关产品推荐

