在的DevExpress网格(XtraGrid中)允许网格和他们的群组有汇总计算。可用的选项包括计数,最大,最小,平均,点心,无和自定义。

有没有人有一些示例代码示出了如何计算加权平均柱,基于在另一列设置为值的权重

有帮助吗?

解决方案

我结束了工作了这一点,并会在这里发布我的解决方案的情况下,其他人发现它是有用的。

如果加权平均值由两部分组成值和每行的权重,然后包含该值应具有重量的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)
};
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top