两个DataGridView行数不一致时计算功能失效问题求助
问题分析与解决方法
我看了你的代码,核心问题出在TotalGross()方法的循环逻辑上:你用dataGridView2.Rows.Count作为循环上限,同时在循环里访问dataGridView1.Rows[i]和dataGridView2.Rows[i]。当两个DataGridView的行数不一致时,比如dataGridView1的行数比dataGridView2少,循环到i超过dataGridView1的行数时,就会抛出索引越界异常,导致整个方法执行中断,txtGross.Text自然就不会被赋值了。
另外还有个隐藏坑:所有计算方法都没处理单元格值为空的情况,如果某个单元格是null或者非数字内容,Convert.ToInt32也会抛出异常,直接打断计算流程。
修复后的代码方案
我帮你重构了代码,把销售和采购的总额计算分开处理,同时加上了空值和非数字的安全校验:
// 计算销售总额(原GrossSale逻辑,增加安全处理) private void GrossSale() { int sum = 0; foreach (DataGridViewRow row in dataGridView1.Rows) { // 跳过DataGridView默认的空白新行 if (row.IsNewRow) continue; // 安全转换,避免空值/非数字导致的异常 if (int.TryParse(row.Cells[2].Value?.ToString(), out int value)) { sum += value; } } txtGrossSale.Text = sum.ToString(); } // 计算销售净额(原NetSale逻辑,增加安全处理) private void NetSale() { int sum2 = 0; foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; if (int.TryParse(row.Cells[3].Value?.ToString(), out int value)) { sum2 += value; } } txtNetSale.Text = sum2.ToString(); } // 计算采购总额(原GrossPurchase逻辑,增加安全处理) private void GrossPurchase() { int sum3 = 0; foreach (DataGridViewRow row in dataGridView2.Rows) { if (row.IsNewRow) continue; if (int.TryParse(row.Cells[2].Value?.ToString(), out int value)) { sum3 += value; } } txtGrossPurchase.Text = sum3.ToString(); } // 计算采购净额(原NetPurchase逻辑,增加安全处理) private void NetPurchase() { int sum4 = 0; foreach (DataGridViewRow row in dataGridView2.Rows) { if (row.IsNewRow) continue; if (int.TryParse(row.Cells[3].Value?.ToString(), out int value)) { sum4 += value; } } txtNetPurchase.Text = sum4.ToString(); } // 修复后的总净额计算方法 private void TotalGross() { // 单独计算销售净额 int salesNet = 0; foreach (DataGridViewRow row in dataGridView1.Rows) { if (row.IsNewRow) continue; if (int.TryParse(row.Cells[3].Value?.ToString(), out int value)) { salesNet += value; } } // 单独计算采购净额 int purchaseNet = 0; foreach (DataGridViewRow row in dataGridView2.Rows) { if (row.IsNewRow) continue; if (int.TryParse(row.Cells[3].Value?.ToString(), out int value)) { purchaseNet += value; } } // 你描述里说要"销售总额减采购总额",原代码是相加,这里根据需求调整: // 如果是减法就改成 salesNet - purchaseNet int total = salesNet + purchaseNet; txtGross.Text = total.ToString(); }
关键改进点
- 分离循环逻辑:不再依赖两个表格行数相同,分别遍历每个DataGridView计算总额,彻底解决行数不一致的问题。
- 安全值转换:用
int.TryParse替代Convert.ToInt32,即使单元格是空值或非数字,也不会抛出异常,计算能正常完成。 - 跳过新行:DataGridView默认会在末尾添加一行空白的新行(
IsNewRow为true),跳过它可以避免计算无效的空数据。
内容的提问来源于stack exchange,提问作者Joey Arnanzo
相关产品推荐
相关产品推荐

