【问题标题】:How to add a weighted average summary to a DevExpress XtraGrid?如何向 DevExpress XtraGrid 添加加权平均摘要?
【发布时间】:2009-02-20 11:11:15
【问题描述】:

DevExpress 网格 (XtraGrid) 允许网格及其组进行汇总计算。可用选项有 Count、Max、Min、Avg、Sum、None 和 Custom。

有没有人有一些示例代码显示如何根据另一列中作为值提供的权重计算加权平均列?

【问题讨论】:

    标签: .net devexpress xtragrid weighted-average group-summaries


    【解决方案1】:

    我最终解决了这个问题,并将在此处发布我的解决方案,以防其他人发现它有用。

    如果加权平均值同时包含一个值和每行的权重,则包含该值的列应将权重 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; }
        }
    }
    

    代码假定基础列值可以通过Convert.ToDouble(object) 转换为双精度值。

    【讨论】:

      【解决方案2】:

      如果您在 sum 中提供自己的 lambda 表达式,您应该能够按标准 sum 对它们进行分组。我认为这应该可行:

      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 集成。
      • 很抱歉,一大早我在想 LINQ 可以用作数据源而无需检查。我想你需要使用“自定义”功能,但我找不到任何关于它的文档。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2017-04-24
      相关资源
      最近更新 更多