Wie eine gewichtete durchschnittliche Zusammenfassung zu einem DevExpress XtraGrid hinzufügen?
-
05-09-2019 - |
Frage
Das DevExpress Grid (XtraGrid) ermöglicht Netze und ihre Gruppen Zusammenfassung Berechnungen zu haben. Die verfügbaren Optionen sind Count, Max, Min, Avg, Sum, None und Benutzerdefiniert.
Hat jemand bekam einigen Beispielcode, der zeigt, wie eine gewichtete durchschnittliche Spalte zu berechnen, basierend auf den Gewichtungen als Werte in einer anderen Spalte zur Verfügung gestellt?
Lösung
Ich landete arbeiten diese aus, und meine Lösung hier, falls andere schreiben es nützlich finden.
Wenn ein gewichteter Durchschnitt sowohl ein Wert besteht und ein Gewicht pro Zeile, dann Spalte, die den Wert enthält, sollte das Gewicht haben Gridcolumn seiner Eigenschaft Tag zugeordnete Objekt. Dann wird dieser Event-Handler den Rest:
private static void gridView_CustomSummaryCalculate(object sender, CustomSummaryEventArgs e)
{
GridColumn weightColumn = ((GridSummaryItem)e.Item).Tag as GridColumn;
if (weightColumn == null)
return;
switch (e.SummaryProcess)
{
case CustomSummaryProcess.Start:
{
e.TotalValue = new WeightedAverageCalculator();
break;
}
case CustomSummaryProcess.Calculate:
{
double size = Convert.ToDouble(e.FieldValue);
double weight = Convert.ToDouble(((GridView)sender).GetRowCellValue(e.RowHandle, weightColumn));
((WeightedAverageCalculator)e.TotalValue).Add(weight, size);
break;
}
case CustomSummaryProcess.Finalize:
{
e.TotalValue = ((WeightedAverageCalculator)e.TotalValue).Value;
break;
}
}
}
private sealed class WeightedAverageCalculator
{
private double _sumOfProducts;
private double _totalWeight;
public void Add(double weight, double size)
{
_sumOfProducts += weight * size;
_totalWeight += weight;
}
public double Value
{
get { return _totalWeight==0 ? 0 : _sumOfProducts / _totalWeight; }
}
}
Der Code geht davon aus, dass die zugrunde liegenden Spaltenwerte können zu Doppel über Convert.ToDouble(object)
umgewandelt werden.
Andere Tipps
Wenn Sie ein eigenen Lambda-Ausdruck in der Summe zur Verfügung stellen, sollten Sie sie durch eine Standard Summe Gruppe in der Lage sein. Ich denke, das sollte funktionieren:
var grouped = from item in items
orderby item.Group
group item by item.Group into grp
select new
{
Average= grp.Sum(row => row.Value * row.Weight)
};