DevExpress社XtraGridに加重平均の要約を追加する方法?
-
05-09-2019 - |
質問
DevExpress社グリッド(XtraGrid)は、グリッドとそのグループは、集計計算を有することを可能にします。利用可能なオプションは、カウント、MAX、MIN、平均、合計、なしとカスタムされます。
誰もが別の列の値として与えられた重みに基づいて加重平均の列を計算する方法を示していますいくつかのサンプルコードを持っていますか?
解決
私はこれを働くことになった、と他の人はそれが役立つ場合には、ここで私の解決策を投稿します。
加重平均値と行当たりの重量の両方で構成されている場合は、、その値を含む列には、そのタグのプロパティに割り当てられた重み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)
介し倍に変換することができることを前提としています。
他のヒント
あなたは合計内部の独自のラムダ式を提供する場合、
あなたは、標準の合計によってグループ化することができるはずです。私は、これは動作するはずだと思う。
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)
};
所属していません StackOverflow