DevExpress网格(XtraGrid)允许网格及其组进行汇总计算。可用选项包括计数,最大值,最小值,平均值,总和,无和自定义。如何将加权平均总结添加到DevExpress XtraGrid?
有没有人有一些示例代码,显示如何计算加权平均列,基于作为另一列中的值提供的权重?
DevExpress网格(XtraGrid)允许网格及其组进行汇总计算。可用选项包括计数,最大值,最小值,平均值,总和,无和自定义。如何将加权平均总结添加到DevExpress XtraGrid?
有没有人有一些示例代码,显示如何计算加权平均列,基于作为另一列中的值提供的权重?
我结束了工作了这一点,并会在这里发布我的解决方案的情况下,其他人发现它是有用的。
如果加权平均值包含每行的值和权重,则包含该值的列应该具有分配给其Tag属性的权重GridColumn对象。然后,该事件处理程序将完成剩下的:
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; }
}
}
的代码假定基础列值可以通过Convert.ToDouble(object)
被转换为加倍。
如果你在总和内提供你自己的lambda表达式,你应该能够用一个标准和来对它们进行分组。我想,这应该工作:
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)
};
@MBirchmeier,谢谢你的回答,但这不会与网格控件的API集成。 – 2009-02-20 11:53:27