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; } } } } } }
参考资料:
https://documentation.devexpress.com/CoreLibraries/DevExpress.Data.CustomSummaryEventArgs.class