本帖最后由 ifu25 于 2017-8-26 14:26 编辑
### 注册事件
[C#] 纯文本查看 复制代码 gvDetail.CustomSummaryCalculate += GvDetail_CustomSummaryCalculate; //实现自定义汇总
### 设置汇总列
[C#] 纯文本查看 复制代码 #region 自定义汇总
gvDetail.OptionsView.ShowFooter = true;
gvDetail.Columns["Quantity"].SummaryItem.SummaryType = SummaryItemType.Custom; //到这里会触发事件
gvDetail.Columns["Quantity"].SummaryItem.DisplayFormat = "特殊合计:{0}";
gvDetail.UpdateSummary(); //因为先绑定了数据又设置了汇总,可以手动触发一次计算
#endregion
### 汇总事件(方法一):直接用数据源dt计算
[C#] 纯文本查看 复制代码 /// <summary>
/// 自定义汇总
/// </summary>
private void GvDetail_CustomSummaryCalculate(object sender, CustomSummaryEventArgs e)
{
//只有当GridSummaryItem的类型为Custom时,才会触发事件
GridSummaryItem gridSummaryItem = e.Item as GridSummaryItem;
if (gridSummaryItem.FieldName == "Quantity")
{
//第1阶段:开始
if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Start){
e.TotalValueReady = true; //设置此项可直接进入Finalize,跳过耗时的Calculate
}
//第2阶段:计算中,会遍历所有行
if (e.SummaryProcess == DevExpress.Data.CustomSummaryProcess.Calculate)
{
//因为在Start设置了e.TotalValueReady = true; 所以这里不会执行
}
//在Finalize进行赋值,也就是循环到最后一行时通过对背后的数据源进行计算一次性赋值
if (e.SummaryProcess == CustomSummaryProcess.Finalize)
{
//取出数据源,可能已过滤
var filteredRows = gvDetail.DataController.GetAllFilteredAndSortedRows();
//通过Linq进行筛选计算
var query = from r in filteredRows.Cast<DataRowView>()
where !r.Row["ProductFullName"].ToString().Contains("日薪") && !r.Row["ProductFullName"].ToString().Contains("QT-") //日薪和QT不统计
select r;
var result = query.Sum(c => float.Parse(c.Row["Quantity"] + ""));
e.TotalValue = result;
}
}
}
### 汇总事件(方法二):逐行遍历累计
即在上面代码事件中有三个阶段,在第二阶段 DevExpress.Data.CustomSummaryProcess.Calculate会遍历Grid所有行,行索引在e.RowHandle,所以在里面自己写计算就行了。
|