zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    百度brpc 压测工具rpc_press解析
    Reactor反应器模式 (epoll)
    hive和hbase的区别
    Hive和HBase
    入门HBase,看这一篇就够了
    Docker保存修改后的镜像
    怎样将本地文件上传到docker容器
    Docker 安装tomcat访问空白页问题解决办法
    Centos中查看系统信息的常用命令
    Docker 镜像加速
  • 原文地址:https://www.cnblogs.com/flysong/p/7979655.html
Copyright © 2011-2022 走看看