ASP.NET中DataTable求和异常:首行无数据、后续漏算最后一行
修复DataTable行添加后求和显示异常的问题
嗨,我看了你的代码和遇到的问题,核心问题其实很明显——你把求和计算的逻辑放在了插入新行之前,而且那个循环完全是多余的,根本没必要!
问题根源拆解
- 首次添加行无显示:进入
else分支时,你先调用了AddTable(),但紧接着就去计算求和,这时候新行还没插入到DataTable里,Sum的结果自然是0或者空,文本框就没内容了。 - 后续添加不包含最后一行:进入
if分支时,同样是先计算现有行的总和,再插入新行,所以求和结果永远是插入前的数值,自然漏掉了刚加的那一行。 - 额外问题:那个
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
相关产品推荐
相关产品推荐

