Pregunta

El DevExpress cuadrícula (XtraGrid) permite que las redes y los grupos tengan cálculos de resumen. Las opciones disponibles son Conde, Max, Min, Media, Suma, Ninguno y Personalizado.

¿alguien tiene un código de ejemplo que muestra cómo calcular una columna de media ponderada, en base a los coeficientes correctores previstos como valores en otra columna?

¿Fue útil?

Solución

Terminé trabajando esto, y publicará mi solución aquí en caso de que otros encuentren útil.

Si un promedio ponderado consiste tanto en un valor y un peso por fila, a continuación, la columna que contiene el valor debe tener el peso GridColumn objeto asignado a su propiedad Tag. A continuación, este controlador de eventos hará el resto:

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

El código se supone que los valores de las columnas subyacentes se pueden convertir en dobles a través de Convert.ToDouble(object).

Otros consejos

Si proporciona su propia expresión lambda interior de la suma que debe ser capaz de agruparlos por una suma estándar. Creo que esto debería funcionar:

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)
};
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top