Domanda

Il DevExpress griglia (XtraGrid) consente di griglie e dei loro gruppi di avere calcoli di riepilogo. Le opzioni disponibili sono Conte, Max, Min, Media, Somma, None e personalizzato.

Qualcuno ha avuto qualche codice di esempio che mostra come calcolare una colonna media ponderata, sulla base dei coefficienti correttori previsti come valori in un'altra colonna?

È stato utile?

Soluzione

ho finito per lavorare questo fuori, e pubblicherà la mia soluzione qui nel caso in cui altri lo trovano utile.

Se la media ponderata è composto da un valore e un peso per riga, poi colonna che contiene il valore dovrebbe avere il peso GridColumn oggetto assegnato alla sua proprietà Tag. Poi, questo gestore di eventi farà il 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; }
    }
}

Il codice presuppone che i valori delle colonne sottostanti possono essere convertiti in doppie tramite Convert.ToDouble(object).

Altri suggerimenti

Se si fornisce il proprio espressione lambda all'interno la somma si dovrebbe essere in grado di gruppo con una somma standard. Penso che questo dovrebbe funzionare:

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)
};
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top