在DataTable中更改单元格值时更新SUM

时间:2016-08-07 20:39:47

标签: c# .net

我的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

正如你可以看到这些价值被添加,但我不知道为什么? 有人可以帮我找到这段代码中的错误吗?

1 个答案:

答案 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"));

enter image description here

甚至循环都可以。无论哪种方式,请记住,如果它基于Expression,则不必使用最后一列 - 事实上你不能。