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

ASP.NET中DataTable求和异常:首行无数据、后续漏算最后一行

修复DataTable行添加后求和显示异常的问题

嗨,我看了你的代码和遇到的问题,核心问题其实很明显——你把求和计算的逻辑放在了插入新行之前,而且那个循环完全是多余的,根本没必要!

问题根源拆解

  1. 首次添加行无显示:进入else分支时,你先调用了AddTable(),但紧接着就去计算求和,这时候新行还没插入到DataTable里,Sum的结果自然是0或者空,文本框就没内容了。
  2. 后续添加不包含最后一行:进入if分支时,同样是先计算现有行的总和,再插入新行,所以求和结果永远是插入前的数值,自然漏掉了刚加的那一行。
  3. 额外问题:那个for循环完全没用,table.Compute("Sum(...)")本身就会计算整个DataTable的对应列总和,循环多少次结果都一样,纯纯的冗余代码。

修复后的完整代码

private void AddRow() 
{
    if (Session["CurrentTable"] != null) 
    {
        DataTable table = (DataTable)Session["CurrentTable"];
        DataRow row = table.NewRow();
        row[0] = ddl_CommodityID.Text.Trim();
        row[1] = txt_CommodityName.Text.Trim();
        row[2] = txt_Unit.Text.Trim();
        decimal price = decimal.Parse(txt_Price.Text.Trim());
        decimal quantity = decimal.Parse(txt_Quantity.Text.Trim());
        decimal taxrate = decimal.Parse(txt_TaxRate.Text.Trim());
        decimal vat = taxrate * quantity * price / 100;
        decimal totalamount = quantity * price;
        row[3] = price;
        row[4] = quantity;
        row[5] = totalamount;
        row[6] = vat;

        // 先插入新行到DataTable
        int insertPosition = table.Rows.Count;
        table.Rows.InsertAt(row, insertPosition);

        // 插入后再计算总和
        txt_TotalAmount.Text = table.Compute("Sum(TotalAmount)", "").ToString();
        txt_TotalTax.Text = table.Compute("Sum(VATtax)", "").ToString();

        CommodityList.DataSource = table;
        CommodityList.DataBind();
        Session["CurrentTable"] = table;
    } 
    else 
    {
        // 修正:获取AddTable()创建的DataTable
        DataTable table = AddTable();
        DataRow row = table.NewRow();
        row[0] = ddl_CommodityID.Text.Trim();
        row[1] = txt_CommodityName.Text.Trim();
        row[2] = txt_Unit.Text.Trim();
        decimal price = decimal.Parse(txt_Price.Text.Trim());
        decimal quantity = decimal.Parse(txt_Quantity.Text.Trim());
        decimal taxrate = decimal.Parse(txt_TaxRate.Text.Trim());
        decimal vat = taxrate * quantity * price / 100;
        decimal totalamount = quantity * price;
        // totalpayment = totalamount + vat; // 如果这个变量有用可以保留,没用就删掉

        row[3] = price;
        row[4] = quantity;
        row[5] = totalamount;
        row[6] = vat;

        // 先插入新行
        int insertPosition = table.Rows.Count;
        table.Rows.InsertAt(row, insertPosition);

        // 插入后计算总和
        txt_TotalAmount.Text = table.Compute("Sum(TotalAmount)", "").ToString();
        txt_TotalTax.Text = table.Compute("Sum(VATtax)", "").ToString();

        CommodityList.DataSource = table;
        CommodityList.DataBind();
        Session["CurrentTable"] = table;
    }
}

关键修改点说明

  • 调整顺序:把「插入新行」的操作放在「计算总和」之前,确保计算的时候新行已经在DataTable里了。
  • 移除冗余循环:删掉那个完全没必要的for循环,table.Compute一次就能得到正确的总和。
  • 修正else分支的table变量:原来的代码里直接用table.NewRow()会报错,因为table没有被赋值,改成DataTable table = AddTable();来获取新建的表。

这样修改后,不管是首次添加还是后续添加行,文本框都会正确显示包含最新行的总和啦!

内容的提问来源于stack exchange,提问作者Nguyễn An

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:57:11