Devexpress Gridview 自定义汇总CustomSummaryCalculate(加权平均)

        Devexpress Gridview 提供了简单的求和,平均等方法,复杂的汇总方法则需要自定义,使用gridview 的CustomSummaryCalculate 事件,根据官网的文档及各论坛案例实现加权平均的方法。 

gridView1.CustomSummaryCalculate += new CustomSummaryEventHandler(view_CustomSummaryCalculate);

  自定义汇总方法(加权平均)

  计算公式:若n个数  的权分别是  ,那么

 

叫做这n个数的加权平均值。

 1 private void gridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
 2         {
 3             if (e.Item != null)
 4             {
 5                 //if (e.IsGroupSummary) {} 分组汇总
 6                 //if (e.IsTotalSummary) {} 全部汇总
 7      
 8                 var gridView = sender as DevExpress.XtraGrid.Views.Grid.GridView;
 9                 if (gridView.Columns.ColumnByFieldName(WeightColumn) != null)
10                 {
11                     GridSummaryItem gridSummaryItem = e.Item as DevExpress.XtraGrid.GridSummaryItem;
12                     switch (e.SummaryProcess)
13                     {             
14                      //calculation entry point 
15                     case DevExpress.Data.CustomSummaryProcess.Start:
16                                 customSummaryValue = 0;
17                                 sumWt = 0;
18                                 break;
19                     //consequent calculations 
20                     case CustomSummaryProcess.Calculate:
21                         if (e.FieldValue != null && e.FieldValue != DBNull.Value)
22                         {
23                             sumWt += Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, WeightColumn));
24                             customSummaryValue += Convert.ToDecimal(e.FieldValue) * Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, WeightColumn));
25                         }
26                         break;
27                     //final summary value 
28                         case CustomSummaryProcess.Finalize:
29                         e.TotalValue = ((sumWt == 0) ? 0 : (customSummaryValue / sumWt));
30                         break;
31                     }                     
32                 }
33             }
34         }

示例图片

示例功能代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using DevExpress.XtraGrid.Views.Grid.ViewInfo;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraEditors;
using DevExpress.XtraGrid;
using DevExpress.Data;

namespace TEST
{
    public partial class FormAverage : Form
    {
        public FormAverage()
        {
            InitializeComponent();
        }

        private void FormAverage_Load(object sender, EventArgs e)
        {
            // 显示记录数量
            GridColumnSummaryItem idTotal = new GridColumnSummaryItem();
            idTotal.SummaryType = SummaryItemType.Count;
            idTotal.DisplayFormat = "{0} records";

            // 对 Length 字段列 汇总平均    
            GridColumnSummaryItem lengthAverage = new GridColumnSummaryItem();
            lengthAverage.SummaryType = SummaryItemType.Average;
            lengthAverage.FieldName = "Length";
            lengthAverage.DisplayFormat = "Average: {0:#.#}";

            // 汇总项目绑定到相应列,显示在view footer
            gridView1.Columns["ID"].SummaryItem.Collection.Add(idTotal);
            gridView1.Columns["Length"].SummaryItem.Collection.Add(lengthAverage);
            gridView1.OptionsView.ShowFooter = true;  

            DataTable dt = new DataTable();
            dt.Columns.Add("ID", typeof(int));
            dt.Columns.Add("Length", typeof(int));
            dt.Columns.Add("Price", typeof(decimal));           
            dt.Columns.Add("Num", typeof(int));
            dt.Rows.Add(1, 10, 2, 1);
            dt.Rows.Add(2, 15, 4, 3);
            dt.Rows.Add(3, 20, 6, 5);
            dt.Rows.Add(4, 28, 8, 7);
            this.gridControl1.DataSource = dt;
            this.gridColumn1.Summary.AddRange(new DevExpress.XtraGrid.GridSummaryItem[] {
                     new DevExpress.XtraGrid.GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Min, "Price", "MIN={0}", "Min"),
                     new DevExpress.XtraGrid.GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Count, "Price", "Count = {0}", "Count"),
                     new DevExpress.XtraGrid.GridColumnSummaryItem(DevExpress.Data.SummaryItemType.Custom, "Price", "Custom Summary = {0}")});
            CalacWeightAverage(gridView1, "Price", "Length","Num");
        }

        Decimal sumWt = 0;    //权重和
        Decimal customSummaryValue;
        string WeightColumn;    //权重列

        //计算加权平均
        void CalacWeightAverage(DevExpress.XtraGrid.Views.Grid.GridView view, string weightColumn, params string[] weightAverageColumns)
        {
            WeightColumn = weightColumn;
            if (view.Columns.ColumnByFieldName(weightColumn) != null)
            {
                if ((view.Columns[weightColumn].ColumnType == typeof(decimal))
                    || (view.Columns[weightColumn].ColumnType == typeof(int)))
                {
                    for (int i = 0; i < weightAverageColumns.Length; i++)
                    {
                        string fieldName = weightAverageColumns[i];
                        if (view.Columns.ColumnByFieldName(fieldName) != null
                            && (!(view.Columns[fieldName].ColumnType != typeof(decimal))
                            || !(view.Columns[fieldName].ColumnType != typeof(int))))
                        {
                            view.Columns[fieldName].SummaryItem.SummaryType = SummaryItemType.Custom;
                            GridSummaryItem gridSummaryItem = view.GroupSummary.Add(SummaryItemType.Custom, fieldName, view.Columns[fieldName]);
                            gridSummaryItem.DisplayFormat = view.Columns[fieldName].SummaryItem.DisplayFormat;
                        }
                    }
                    //gridView1.CustomSummaryCalculate += new CustomSummaryEventHandler(gridView1_CustomSummaryCalculate);    
                }
            }
        }

        // 自定义汇总算法
        private void gridView1_CustomSummaryCalculate(object sender, DevExpress.Data.CustomSummaryEventArgs e)
        {
            if (e.Item != null)
            {
                //if (e.IsGroupSummary) {} 分组汇总
                //if (e.IsTotalSummary) {} 全部汇总
     
                var gridView = sender as DevExpress.XtraGrid.Views.Grid.GridView;
                if (gridView.Columns.ColumnByFieldName(WeightColumn) != null)
                {
                    GridSummaryItem gridSummaryItem = e.Item as DevExpress.XtraGrid.GridSummaryItem;
                    switch (e.SummaryProcess)
                    {             
                     //calculation entry point 
                    case DevExpress.Data.CustomSummaryProcess.Start:
                                customSummaryValue = 0;
                                sumWt = 0;
                                break;
                    //consequent calculations 
                    case CustomSummaryProcess.Calculate:
                        if (e.FieldValue != null && e.FieldValue != DBNull.Value)
                        {
                            sumWt += Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, WeightColumn));
                            customSummaryValue += Convert.ToDecimal(e.FieldValue) * Convert.ToDecimal(gridView.GetRowCellValue(e.RowHandle, WeightColumn));
                        }
                        break;
                    //final summary value 
                        case CustomSummaryProcess.Finalize:
                        e.TotalValue = ((sumWt == 0) ? 0 : (customSummaryValue / sumWt));
                        break;
                    }                     
                }
            }
        }   
    }
}
View Code

参考资料:

https://documentation.devexpress.com/WindowsForms/701/Controls-and-Libraries/Data-Grid/Summaries/Working-with-Summaries-in-Code

https://documentation.devexpress.com/CoreLibraries/DevExpress.Data.CustomSummaryEventArgs.class

https://www.cnblogs.com/EasyInvoice/p/3892136.html

原文地址:https://www.cnblogs.com/flysong/p/7979655.html