2016-08-07 10 views
1

私のC#コードに問題があります。 私がやろうとしているのは、自分のdataTableに新しい行を追加してから、いくつかのことを計算して特定のセルに挿入することです。それは、初めて正しく動作DataTableのセル値が変更されたときのSUMの更新

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()); 

:ここ

はI'vが得たものです。 しかし、私はいくつかのセルの値を変更するとき、私はこの同じコード(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 

asあなたはこれらの値が追加されているのを見ることができますが、それはなぜですか? 誰かがこのコードのバグを見つけられるのを助けることができますか?

答えて

1

スプレッドシートではないため、最後の行を除外することはできません。 3列目も合計であるように見えますか?

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が追加されるように列が入力されています。もしそうなら、そのDataTableが維持式にすることができます。あなたは既にあるように、おそらくいくつかのデータを追加します。

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に基づいている場合は、最後の列を覚えていないことを忘れないでください。実際はあなたは傾けることができます。

+0

助けてくれてありがとう、私はちょうどそれを完了し、それは動作します! – JustSomeNewbie

関連する問題