Question

La grille DevExpress (XtraGrid) permet des grilles et leurs groupes d'avoir des calculs sommaires. Les options disponibles sont Count, Max, Min, Moy, Somme, Aucun et personnalisé.

Quelqu'un at-il un exemple de code qui montre comment calculer une colonne moyenne pondérée, en fonction des coefficients correcteurs prévus sous forme de valeurs dans une autre colonne?

Était-ce utile?

La solution

J'ai fini par travailler ceci, et nous publierons ma solution ici dans d'autres cas trouver utile.

Si une moyenne pondérée consiste à la fois une valeur et un poids par ligne, puis la colonne contenant la valeur devrait avoir le poids GridColumn objet assigné à sa propriété Tag. Ensuite, ce gestionnaire d'événements fera le reste:

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

Le code suppose que les valeurs des colonnes sous-jacentes peuvent être convertis en double via Convert.ToDouble(object).

Autres conseils

Si vous fournissez votre propre expression lambda dans la somme que vous devriez être en mesure de les regrouper par une somme standard. Je pense que cela devrait fonctionner:

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)
};
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top