2009-02-20 84 views
0

DevExpress网格(XtraGrid)允许网格及其组进行汇总计算。可用选项包括计数,最大值,最小值,平均值,总和,无和自定义。如何将加权平均总结添加到DevExpress XtraGrid?

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

回答

2

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

如果加权平均值包含每行的值和权重,则包含该值的列应该具有分配给其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)被转换为加倍。

0

如果你在总和内提供你自己的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) 
}; 
+0

@MBirchmeier,谢谢你的回答,但这不会与网格控件的API集成。 – 2009-02-20 11:53:27