Как добавить средневзвешенную сводку в DevExpress xtrag grid?
-
05-09-2019 - |
Вопрос
Сетка DevExpress (xtrag grid) позволяет сеткам и их группам выполнять итоговые вычисления.Доступными опциями являются Count, Max, Min, Avg, Sum, None и Custom.
У кого-нибудь есть какой-нибудь пример кода, который показывает, как вычислить столбец средневзвешенного значения на основе весов, предоставленных в качестве значений в другом столбце?
Решение
В итоге я решил это сделать и опубликую свое решение здесь на случай, если другие сочтут его полезным.
Если средневзвешенное значение состоит как из значения, так и из веса для каждой строки, то столбец, содержащий значение, должен иметь объект weight GridColumn, присвоенный его свойству Tag.Затем этот обработчик событий сделает все остальное:
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; }
}
}
Код предполагает, что значения базового столбца могут быть преобразованы в double с помощью Convert.ToDouble(object)
.
Другие советы
Если вы предоставите свое собственное лямбда-выражение внутри суммы, вы сможете сгруппировать их по стандартной сумме.Я думаю, это должно сработать:
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)
};