涛神联合Dxper.Net开发者论坛管理在腾讯课堂开启DevExpress基础和高级培训课程 详情可以加群QQ群:294560883
DevExpress 的GridView或BanedGridView提供了自定义汇总的功能,目的是解决一些特殊的统计计算;
要让实现自定义统计功能,
1、首先当然是设置GridView.OptionsView.ShowFooter=true;显示汇总统计行在GridView的底部;
2、设置要自定义汇总统计的列的SummaryItem>SummaryType属性为Custom,如下图
3、注册GridView的CustomSummaryCalculate事件
以上为准备工作,事件内具体的代码处理,这里我提供一个通用的方法给大家,代码说明见注释
/// <summary>
/// 自定义时间点汇总统计
/// </summary>
/// <param name="view">GridView视图</param>
/// <param name="timeFieldNames">要自定义汇总的时间点列</param>
public static void CustomTimeSummary(GridView view, params string[] timeFieldNames)
{
//强制初始化,如果列是动态通过数据源加载的,则绑定数据源后gridview想获取列的话,需要调用强制初始化的方法
view.GridControl.ForceInitialize();
//设置指定列的汇总统计会自定义汇总
foreach(var field in timeFieldNames)
{
var col = view.Columns[field];
if (col != null)
{
col.SummaryItem.SummaryType = SummaryItemType.Custom;
}
}
TimeSpan sum = new TimeSpan(0, 0, 0);
view.CustomSummaryCalculate += (s, e) =>
{
if (e.IsTotalSummary && timeFieldNames.Contains((e.Item as GridSummaryItem).FieldName))
{
GridSummaryItem item = e.Item as GridSummaryItem;
if (timeFieldNames.Contains(item.FieldName))
{
switch (e.SummaryProcess)
{
case CustomSummaryProcess.Start://开始计算
sum = new TimeSpan(0, 0, 0);
break;
case CustomSummaryProcess.Calculate://计算中
if (TimeSpan.TryParse(e.FieldValue?.ToString(), out TimeSpan result))
{
sum += result;
}
else
{
var strs = e.FieldValue?.ToString().Split(':');
if (strs!=null&&strs.Length == 2)
{
int h = Convert.ToInt32(strs[0]);
int m = Convert.ToInt32(strs[1]);
if (m >= 60)
{
h += 1;
m = m - 60;
}
if (h > 24)
{
var day = h / 24;
var time = new TimeSpan(h/24, h-24*day, m, 0);
sum += time;
}
else
{
var time = new TimeSpan( h, m, 0);
sum += time;
}
}
}
break;
case CustomSummaryProcess.Finalize://计算完毕设置值
e.TotalValue = $"{sum.Days * 24 + sum.Hours}小时{sum.Minutes}分";
break;
}
}
}
};
//重新刷新数据源,这样才能触发CustomSummaryCalculate事件
view.RefreshData();
}
调用示例:
private void Form2_Load(object sender, EventArgs e)
{
gridView1.Columns.Clear();
DataTable dt = new DataTable();
dt.Columns.Add("id");
dt.Columns.Add("time");
dt.Columns.Add("time2");
dt.Rows.Add(1, "08:31", "08:31");
dt.Rows.Add(2, "10:60", "01:32");
dt.Rows.Add(3, "90:31", "08:32");
gridControl1.DataSource = dt;
CustomTimeSummary(gridView1, "time", "time2");
}
结果图: