2016-08-07 15 views
1

Ich habe ein Problem mit meinem C# -Code. Was ich versuche ist, neue Zeile zu meiner DataTable hinzufügen und dann einige Dinge berechnen und in bestimmte Zellen einfügen.Aktualisieren von SUMME, wenn Zellenwert in DataTable geändert wird

Hier ist, was I'v bekommt:

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

es richtig zum ersten Mal funktioniert. Aber wenn ich einen Zellwert ändere, dann berechne ich dies mit demselben Code (Teil mit dataTable =) und wenn ich es tue, wird der Zellwert nicht ersetzt, dies wird hinzugefügt.

Beispiel:

Als ich hatte dies:

10 3 13 
    6 1  7 
    2 0  2 
18 4 22 << This is SUM 

Und ich einfügen 1 in irgendeiner Zelle in der 2. Säule im erwartete dies:

10 3 13 
    6 1  7 
    2 1  3 
18 5 23 

Aber was im immer ist:

10 3 13 
    6 1  7 
    2 1  3 
38 9 45 

Als Sie können sehen, dass diese Werte nur hinzugefügt werden, aber ich verstehe es nicht warum? Kann mir jemand helfen, einen Fehler in diesem Code zu finden?

Antwort

1

Es ist keine Tabelle, also weiß es nicht, die letzte Zeile aus der Formel auszuschließen. Es sieht so aus, als wäre die 3. Spalte auch ein Total? Wenn ja, kann dass ein Ausdruck sein, die die DataTable hält:

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"; 

Die Spalten sind typisiert, so dass X+Y hinzufügt. Fügen Sie einige Daten wahrscheinlich Sie bereits sind:

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)", "")); 

Die letzte Spalte berechnet werden muss, die Expression kümmern, dass. Eine Möglichkeit, Compute zu verwenden und nicht umfassen die Gesamtsumme Zeile, wäre zu entfernen und readd es jedes Mal: ​​

int nRows = dtXYZ.Rows.Count - 1; 
dtXYZ.Rows.RemoveAt(nRows); 
dtXYZ.Rows.Add(dtXYZ.Compute("sum(X)", ""), 
       dtXYZ.Compute("sum(Y)", "")); 

Aber anstatt zu tun, dass nur in der Lage sein Compute zu verwenden, können Sie das Summieren sich mit einige Erweiterungsmethoden und poste den neuen Wert:

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

Oder sogar eine Schleife funktionieren würde. Wie auch immer, denken Sie daran, dass Sie nicht mit der letzten Spalte herumspielen müssen, wenn sie auf einer Expression basiert - in der Tat können Sie nicht.

+0

Danke für die Hilfe, ich bekomme es einfach fertig und es funktioniert! – JustSomeNewbie