我的c#代码存在问题。 我尝试做的是在我的dataTable中添加新行,然后计算一些内容并插入到特定的单元格中。
以下是我所得到的:
object sumAmount;
object sumDest;
object sumWhole;
DataRow row = dataTable.NewRow();
row["number"] = "1";
dataTable.Rows.Add(row);
sumAmount = dataTable.Compute("Sum(amount)", "");
dataTable.Rows[dataTable.Rows.Count - 1][all] = Int32.Parse(sumAmount.ToString());
sumDest = dataTable.Compute("Sum(dest)", "");
dataTable.Rows[dataTable.Rows.Count - 1][columnNumber] = Int32.Parse(sumDest.ToString());
sumWhole = dataTable.Compute("Sum(wholeAmount)", "");
dataTable.Rows[dataTable.Rows.Count - 1][allTogether] = Int32.Parse(sumWhole.ToString());
它第一次正常工作。 但是当我改变一些单元格值时,我会用相同的代码重新计算它(使用dataTable =的部分),当我这样做时,单元格值不被替换,这就加了。
示例:
当我有这个时:
10 3 13
6 1 7
2 0 2
18 4 22 << This is SUM
我在第二栏的某个单元格中插入1我期待这个:
10 3 13
6 1 7
2 1 3
18 5 23
但是我得到的是:
10 3 13
6 1 7
2 1 3
38 9 45
正如你可以看到这些价值被添加,但我不知道为什么? 有人可以帮我找到这段代码中的错误吗?
答案 0 :(得分:1)
它不是电子表格,因此它不知道从公式中排除最后一行。看起来第3列也是Total?如果是这样,那么 可以是DataTable
维护的表达式:
dtXYZ = new DataTable();
dtXYZ.Columns.Add("X", typeof(Int32));
dtXYZ.Columns.Add("Y", typeof(Int32));
dtXYZ.Columns.Add("Z", typeof(Int32));
dtXYZ.Columns["Z"].Expression="X+Y";
键入列以便添加X+Y
。添加一些可能与您相似的数据:
dtXYZ.Rows.Add(new object[]{10, 3});
dtXYZ.Rows.Add(new object[]{6, 1});
dtXYZ.Rows.Add(new object[]{2, 0});
dtXYZ.Rows.Add(dtXYZ.Compute("sum(X)", ""),
dtXYZ.Compute("sum(Y)", ""));
确实需要计算最后一列,Expression
将负责计算。使用Compute
而不包括总行的一种方法是每次删除和读取它:
int nRows = dtXYZ.Rows.Count - 1;
dtXYZ.Rows.RemoveAt(nRows);
dtXYZ.Rows.Add( dtXYZ.Compute("sum(X)", ""),
dtXYZ.Compute("sum(Y)", ""));
但是,为了能够使用Compute
而不是这样做,您可以使用一些扩展方法自行求和并发布新值:
int nRows = dtXYZ.Rows.Count - 1;
dtXYZ.Rows[nRows ]["X"] = dtXYZ.AsEnumerable()
.Take(nRows)
.Sum(x => x.Field<int>("X"));
dtXYZ.Rows[nRows ]["Y"] = dtXYZ.AsEnumerable()
.Take(nRows)
.Sum(x => x.Field<int>("Y"));
甚至循环都可以。无论哪种方式,请记住,如果它基于Expression
,则不必使用最后一列 - 事实上你不能。