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?

War es hilfreich?

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)
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top