0

La grille DevExpress (XtraGrid) permet aux grilles et à leurs groupes d'avoir des calculs sommaires. Les options disponibles sont Nombre, Max, Min, Moy, Somme, Aucun et Personnalisé.Comment ajouter un résumé moyen pondéré à un DevExpress XtraGrid?

Quelqu'un at-il obtenu un exemple de code qui montre comment calculer une colonne moyenne pondérée, sur la base des pondérations fournies en tant que valeurs dans une autre colonne?

Répondre

2

J'ai fini par mettre cela au point, et je posterai ma solution ici au cas où d'autres la trouveraient utile.

Si une moyenne pondérée comprend à la fois une valeur et un poids par ligne, la colonne contenant la valeur doit avoir l'objet GridColumn de poids affecté à 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).

0

Si vous fournissez votre propre expression lambda à l'intérieur de la somme, vous devriez pouvoir les grouper 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) 
}; 
+0

@MBirchmeier, merci pour la réponse mais celle-ci ne s'intégrera pas à l'API de contrôle de grille. –

+0

Désolé ce matin tôt je pensais que LINQ pourrait être utilisé comme source de données sans prendre la peine de vérifier cela. J'imagine que vous devez utiliser la fonction 'custom', mais je ne trouve aucune documentation dessus. – MBirchmeier

Questions connexes