列小时求和:使用ShowFooter属性时如何设置列底空白及SummaryItem格式?
搞定列下空白区域+小时总和统计的方案
嘿,针对你的需求,我给你整理了两步走的具体实现方法,都是基于DevExpress Grid控件的常用操作哈:
一、给列下方加空白区域
当你开启ShowFooter后,默认的Footer栏是紧贴数据行的,要加空白很简单,直接调整GridView的FooterPanelHeight属性就行——把它设为比默认值更大的数值,多余的部分就会变成空白区域。比如:
// 假设你的GridView是gridView1,把Footer高度设为80(默认大概20左右) gridView1.FooterPanelHeight = 80;
这样Footer栏就会变高,汇总内容显示在上方,下方自然就留出空白啦。如果需要针对特定列做更精细的空白控制,也可以自定义Footer绘制,但这个方法是最省心的。
二、用SummaryItem实现小时总和统计
因为你存储的是HH:mm格式的时间,首先得计算每行的时长(Me减去Se的小时数),然后再做汇总。这里给你两种方法:
方法1:先给数据源加计算列(推荐,逻辑清晰)
先从数据库查询数据后,给你的DataTable加一个计算列,算出每行的小时时长,再绑定到Grid:
// 假设你的查询结果存在dtLogBook里 DataTable dtLogBook = new DataTable(); // 这里写你的查询代码... // 添加计算列,存储每行的小时时长 dtLogBook.Columns.Add("TotalHours", typeof(double)); foreach (DataRow row in dtLogBook.Rows) { DateTime seTime = DateTime.Parse(row["Se"].ToString()); DateTime meTime = DateTime.Parse(row["Me"].ToString()); TimeSpan duration = meTime - seTime; row["TotalHours"] = duration.TotalHours; // 转换成总小时数,支持小数 } // 绑定到GridControl gridControl1.DataSource = dtLogBook;
然后给对应的列添加汇总项:
GridView gridView = gridControl1.MainView as GridView; // 获取你要显示汇总的列(比如刚才加的TotalHours列) GridColumn hourColumn = gridView.Columns["TotalHours"]; // 创建汇总项 GridSummaryItem sumItem = new GridSummaryItem(); sumItem.FieldName = "TotalHours"; sumItem.SummaryType = DevExpress.Data.SummaryItemType.Sum; // 设置显示格式,比如保留两位小数 sumItem.DisplayFormat = "总时长: {0:N2} 小时"; // 把汇总项加到列的汇总集合里 hourColumn.Summary.Add(sumItem); // 确保Footer开启 gridView.OptionsView.ShowFooter = true;
方法2:自定义汇总事件(不用修改数据源)
如果不想动数据源,直接通过GridView的自定义汇总事件来计算:
GridView gridView = gridControl1.MainView as GridView; gridView.OptionsView.ShowFooter = true; // 给任意一列添加自定义汇总项(这里选Me列为例) GridSummaryItem customSum = new GridSummaryItem(); customSum.SummaryType = DevExpress.Data.SummaryItemType.Custom; customSum.DisplayFormat = "总时长: {0:N2} 小时"; gridView.Columns["Me"].Summary.Add(customSum); // 处理自定义汇总计算事件 gridView.CustomSummaryCalculate += (sender, e) => { if (e.SummaryItem.SummaryType != DevExpress.Data.SummaryItemType.Custom) return; switch (e.SummaryProcess) { case DevExpress.Data.CustomSummaryProcess.Start: // 初始化总和为0 e.TotalValue = 0d; break; case DevExpress.Data.CustomSummaryProcess.Calculate: // 取出当前行的Se和Me时间,计算时长 DateTime se = DateTime.Parse(gridView.GetRowCellValue(e.RowHandle, "Se").ToString()); DateTime me = DateTime.Parse(gridView.GetRowCellValue(e.RowHandle, "Me").ToString()); TimeSpan duration = me - se; // 累加到总和 e.TotalValue = (double)e.TotalValue + duration.TotalHours; break; // End阶段不需要额外操作,自动显示结果 } };
最后两步结合
把上面的Footer高度设置和汇总代码放在一起,运行后就能看到:Footer栏有空白区域,同时显示出所有行的小时总和啦。
内容的提问来源于stack exchange,提问作者Burak Turhan
相关产品推荐
相关产品推荐

