You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:07:55