C# c# WPF DataGrid Rows Summieren

speedsam

Cadet 2nd Year
Registriert
Sep. 2014
Beiträge
22
hallo,

ich habe folgendes Szenario:

Datagrid , mit Daten über Observable Collection und Autogenerated Collums " False" befüllt
datum, decimal, decimal, decimal

nun muss ich entsprechend die Summen auch ausgeben. Vielleicht in einer TextBock?
das ich eine Schleife Bauen muss ist klar, aber wie,,.. ich finde nicht herraus, wie ich auf die einzellnen Spalten zugreifen kann..
bisher schaut der CODE so aus.
Code:
 public void btnStart_Click(object sender, RoutedEventArgs e)
        {
            decimal summeUmsatz = 0;
                Database _db = new Database();
                ObservableCollection<GesamtUmsatz> _glist = new ObservableCollection<GesamtUmsatz>();
                _glist = _db.CreateGesamtUmsatzList2(uitag, uimonat, uijahr, uibutton);            
                UmsatzGrid2.ItemsSource = _glist;
                for (int counter = 0; counter < (UmsatzGrid2.Items.Count - 1); counter++)
                {
                    summeUmsatz += UmsatzGrid2........ <----------------

                    }
              txtsummeUmsatz.text = summeUmsatz;
        }

es gibt keine Row- Eigenschaften , damit ich sagen kann.. :

summeUmsatz +=UmsatzGrid2.Row[1].Collumn[counter] ( für die Zweite Spalte..)


Danke schon einmal für Ihre Hilfe
 
Wiso greifst du nicht direkt auf deine Collection zu um die Summe zu bilden ?

var summe = _glist.Sum(gu => gu.PropertyDasSummiertWerdenSoll)
 
http://msdn.microsoft.com/en-us/library/bb310552.aspx

http://www.codeproject.com/Articles/30905/WPF-DataGrid-Practical-Examples#summary
Du willst einen Gesamt Betrag haben?
total = items.Sum(p=>p.totalprice);
z.b
Wähle eine ITEM Class
public class Item{
public double Price {get;set;}
public int Quantity {get;set;}
//Bei Rabatt
public double Discount {get;set;}
public double Item Price {get;set;}
}
Nachdem du die Beträge in die DATA Grind eingefügt hast.
public void ItemAdded(Item item){
var price = item.price;
var qty = item.quantity;
var discount = item.discount;
item.totalprice = price*qty*Discount;

//my collection is an ObservableCollection<item>
MyCollection.Add(Item);
}
Die datagrid ist jetzt an die ObservableCollection gebunden. Die collection wird jedesmal aktualisert.
Mach ein Total Texblock binde (bind) mit dem total property Nach der Aktualisierung rufe den INPC Event auf.
Du kannst den Code unten unter ItemAdded plazieren.
total = items.Sum(p=>p.totalprice);
 
Zuletzt bearbeitet:
hey, danke shcon einmal für euere Hilfe... Herr, Nobody, das ist meines erachtesn nciht genau das was ich brauche...

und Herr Kassenwart, ich finde deine Lösung ist einwenig simpler und einfacher.

nun, ich hätte es so probiert :
Code:
summeUmsatz = _glist.Sum(UmsatzGrid2 => UmsatzGrid2.Umsatz);
^Fehler
aber er bringt mir folgende Fehlermeldung:
a local variable named "UmsatzGrid2" cannot be declared in this scope because it would give a different meaning to "UmsatzGrid2", wich is already used in a "parent or current" scope to denote something else

..
aber das gute ist ich kann hier auf "UmsatzGrid2.Umsatz" kommen.. aber wie bekomme ich diesen Fehler weg?
 
speedsam schrieb:
nun, ich hätte es so probiert :
Code:
summeUmsatz = _glist.Sum(UmsatzGrid2 => UmsatzGrid2.Umsatz);
Der Code hat mit dem DataGrid überhaupt nichts zu tun.
Du summierst hier auf der Datenquelle des DataGrids, was (aus Architektursicht) sogar besser ist.

Der Fehler sagt dir erst mal, dass du eine Variable deklarierst mit dem selben Namen einer anderen Variable. Zwischen der "(" und dem "=>" deklarierst du eine Variable (auch wenn's auf den ersten Blick nicht so aussieht, siehe auch unten). Diese hast du "UmsatzGrid2" genannt, die es bei dir schon gibt.
Was die Sum-Methode effektiv hier machen müsste (ohne =>):
Code:
decimal temp = 0;
foreach (decimal UmsatzGrid2 in _glist) {
   temp += UmsatzGrid2;
}
summeUmsatz = temp;
Das macht natürlich keinen Sinn, da UmsatzGrid2 ja dein DataGrid ist und nicht noch mal als Schleifenvariable auftauche kann.
Die Lösung ist einfach: Du statt "UmsatzGrid2" etwas verwenden, z. B. umsatzDatensatz.

Um den Fehler wirklich aber zu verstehen, musst du auch verstehen was Lamda Expressions sind ("UmsatzGrid2 => UmsatzGrid2.Umsatz" ist nämlich so einer). Das ist gerade als Anfänger nicht ganz einfach, die sich dadurch erschließenden Möglichkeiten sind es meiner Meinung nach aber wert. Davor sollte man aber die Basics von C# verinnerlicht haben.
 
Ein MVVM Ansatz wäre auf jeden Fall sinnvoller. Dann kannst du die ganzen Events auch zur Seite tun und besser auf die Änderung deines View Models reagieren
 
aber ich habe ein DataGrid.. ich verstehe nicht genau wie ich daras ein View machen kann..

dessweiteren bei diesem ansatz:
Code:
    decimal temp = 0;
    foreach (decimal UmsatzGrid2 in _glist) {
    temp += UmsatzGrid2;
    }
    summeUmsatz = temp;

gibt es bei der schleife
decimal UmsatzGrid2 in _glist

die _glist hat 31 Zeilen, und 5 Spalten.. ich muss auf die 2te, 3te, 4te, und 5te Spalte Zugreifen können...
nicht irgendwie auf das UmsatzGrid2 in _glist..
 
speedsam schrieb:
die _glist hat 31 Zeilen, und 5 Spalten.. ich muss auf die 2te, 3te, 4te, und 5te Spalte Zugreifen können...
nicht irgendwie auf das UmsatzGrid2 in _glist..
Das DataGrid ist nicht in _glist! Das DataGrid dient nur zur visuellen Darstellung der Daten in _glist.
_glist ist eine Liste von Objekten vom Typ "GesamtUmsatz" (diese werden als Zeilen dargestellt). Diese (z. B. 31) Objekte haben wiederum verschiedene Eigenschaften (diese siehst du im DataGrid als Spalten).

Mit diesem Code läufst du über alle Objekte in _glist:
Code:
foreach (GesamtUmsatz umsatzObjekt in _glist) {
    // Mit umsatzObjekt.Name_der_Spalte kannst auf die einzelnen Eigenschaften (= Spalten) zugreifen.
    // Wenn du umsatzObjekt. getippt hast, sollte dir Visual Studio automatisch eine Liste von Eigenschaften anbieten.
    // Hier kannst du dann das summieren, was du willst.
}

Grundsätzlich würde ich dir aber empfehlen dich mit Objektorientierung auseinander zu setzen, bevor du dich an Sachen wie WPF-GUIs und Datenbanken machst. Sonst wird das sehr schnell sehr frustrierend, da das gesamte .NET Framework objektorientiert aufgebaut ist. OOP lernt aber man nicht von heute auf morgen, weshalb du auch zunächst nur kleine Schritte in Konsolenanwendungen machen solltest. Wenn das sitzt mach der Rest auch viel mehr Spaß. :)
 
Zurück
Oben