在开发ERP系统的数据报表时,几乎都是需要看到【小计】、【总计】这样的汇总数据的,在数据报表的显示列表中,最下面的一行通常就是【小计】或者【总计】的汇总行。如果手动为每个报表都增加汇总行,那也是一份不小的工作量。

  所以,如果能自动为每个数据报表自动添加【小计】、【总计】汇总行,那将可以节省不少的开发时间。本文将给出实现这种方案的思路原理以及源码。

  本文中,报表数据的显示使用的是WinForm的DataGridView控件,如果是Web项目,其原理和思路是一样的。

  举个栗子,零售店POS机上查询销售单的效果如下图所示:

  

  在报表的最下面有一行【总计】,对数量和金额项进行了汇总。

  下面,我们来详细讲解是如何自动为其添加【总计】这一汇总行的。

一.基本原理

1.一般而言,数据报表的现实的核心数据是DataGridView绑定的一个列表List<T>,每一个T对象对应着报表中的一行数据。

2.在数据报表中,【小计】、【总计】所对应的汇总行与上面列表中的其它普通行,是有区别的,所以,它们对应的T对象也是有区别的。

3.我们通过T的一个名为 IsStatistics 的bool属性来区别普通行与汇总行。如果IsStatistics为true,表示其对应的行就为汇总行。

4.为了达到上面描述的这一目的,我们让T必须实现接口IStatisticabled这个接口。

    public interface IStatisticabled{bool IsStatistics { set; get; }}

5.为报表添加汇总行,实际上就是向List<T>列表中添加一个 IsStatistics 为true的 T 对象。

6.然后,通过反射来统计需要汇总的那些项(即T的某些属性),然后将汇总得到的结果赋值给汇总T对象对应的属性。

7.在绑定到DataGridView时,通过判断列表中 T 对象的IsStatistics属性,如果为true,就将该行Row对应的RowHeader的文本设置为【小计】或【总计】。

二.思路实现

  就上面描述的思路来看,稍微有点难度的地方在于最后两点,下面我们就详细讲解一下。

1.为List<T>增加汇总行

  增加汇总行,所用到的主要技术就是反射Relection。

    /// <summary>/// 为数据报表增加一个汇总行。/// </summary>/// <typeparam name="T">报表记录对象的类型</typeparam>/// <param name="list">数据行对象列表</param>/// <param name="statColumns">需要进行统计的列</param>public static void AddSumRow<T>(List<T> list ,params string[] statColumns) where T :IStatisticabled, new(){T sum = new T();sum.IsStatistics = true;foreach (string column in statColumns) //针对每一个汇总项{double total = 0;foreach (T t in list) //统计{object val = ReflectionHelper.GetProperty(t, column);total += double.Parse(val.ToString());}object newTotal = TypeHelper.ChangeType(typeof(T).GetProperty(column).PropertyType, total);ReflectionHelper.SetProperty(sum, column, newTotal);}list.Add(sum);}

(1)为了可以动态new一个统计行,必须要让T有 new() 这个约束。

(2)将统计行的 IsStatistics 标记设置为true。

(3)针对每一个统计项进行统计:通过反射拿到每一行该项的属性值,并转换成double类型(因为double兼容了所有的数值类型),进行累加,然后将累加的结果转换成正确的类型,最后,赋值给统计行对应的属性。

(4)将统计行添加到list列表中,作为最后一个对象。

2.绑定到DataGridView

    List<RetailOrder> list = this.GetOrderList();AddSumRow(list, new string[] { "Count", "Money" });this.dataGridView1.DataSource = list;DataGridViewCellStyle style = new DataGridViewCellStyle();style.Font = new Font(this.dataGridView1.DefaultCellStyle.Font.Name,         this.dataGridView1.DefaultCellStyle.Font.Size, FontStyle.Bold);this.dataGridView1.RowHeadersDefaultCellStyle = style;this.dataGridView1.Rows[list.Count - 1].HeaderCell.Value = "总计";this.dataGridView1.Rows[list.Count - 1].DefaultCellStyle = style;  

(1)通过GetOrderList方法获取到销售单列表后,我们通过AddSumRow方法为其添加一个汇总行,并对【Count】、【Money】进行汇总。

(2)将包含了汇总行的列表绑定到DataGridView。

(3)将最后一行的RowHeader的Cell的value设置为【总计】 。

(4)将【总计】行的所有数据显示都变成粗体。

三.示例源码下载

1.本文Demo源码:DataReportsSample.rar

2.该Demo中用到了ESBasic的反射帮助类ReflectionHelper,这里可以下载我的开源基础类库:ESBasic 源码。

四.后续功能

    本文示例是一个【小计】、【总计】汇总功能的基础展示,实际应用中,通常还会牵涉到以下问题:

(1)当报表数据存在分页时,一般会同时存在【小计】、【总计】行,【小计】是本页的汇总,【总计】是所有业的汇总。

(2)当DataGridView绑定的某些列对应着Entity的某个只读属性,并且这个只读属性不会返回null和string.Empty时,汇总行的这一列就会有文字显示(这是一个非汇总行,目标单元格应该是空的),要如何处理?

(3)当DataGridView的某一些是一个操作列,即对应着DataGridViewLinkColumn,如果让汇总行的目标单元格中不出现Link,而是留空了?

(4)有些数据的汇总,可能是要进行绝对值的汇总,那又该如何处理?

这些问题,我们都将在下篇文章的示例中一并解决,敬请期待。

数据报表开发技巧:自动为数据报表添加【小计】、【总计】行相关推荐

  1. 帆软 JAVA扩展_java报表开发工具FineReport教程之报表设计:单元格扩展

    java报表开发工具FineReport教程之报表设计:单元格扩展 报表设计章节适用于对报表业务有一定的了解,需要学习FineReport报表的初学者. 通过该章节的学习,可以掌握设计器的使用,了解报 ...

  2. access 报表中序号自动_数据报表多种序号生成方式

    报表系统中,往往要对数据进行编号处理,从而使数据的条目更加清晰.在 excel 中,我们可以直接在一个单元格中输入 1,然后按住 Ctrl 向下拖拽单元格就可以自动生成连续的序号.不过除了连续的序号, ...

  3. 在报表开发工具Stimulsoft Report数据透视表的新功能介绍

    在本文中,我们将向您介绍自 Stimulsoft Ultimate 2022.3 版本以来可用的数据透视表元素功能. Stimulsoft Ultimate官方正版下载 使用此仪表板元素,您可以通过匹 ...

  4. 自动化办公之excel教程(2):各种数据的输入,自动填充数据,表格操作小技巧

    一.各种类型数据的录入 1.数据输入 加粗样式选中单元格后,左上侧会出现字母和数字,如图中的C9,即可在文中输入数据. 2.货币输入 在某一单元格输入框里右键选中设置单元格格式. 3.数字输入 如果我 ...

  5. 网新 恒天Reporting COE的报表开发能力和恒天报表云平台

    报表覆盖: 1. BIRT / Cognos / Crystal / Jasper报表开发:   2. Actuate与Jasper之间的迁移以及相应的报表开发:Crystal与Jasper之间的迁移 ...

  6. oracle excel报表开发,深入浅出OracleEBS之Excel报表开发.doc

    深入浅出OracleEBS之Excel报表开发 Oracle ERP最佳技术实践 E-Business Suite Oracle核心应用技术 Excel报表开发 Author:黄建华Jianhua.H ...

  7. birt报表表格边框_选开源报表开发还是商用?2020报表软件产品整理

    开源报表却越来越受到程序员热烈追捧,如ireport. Jsper report.jfreechart这样的免费,开源的JAVA报表工具,在一下开源的JAVA报表相关的论坛里面都是热火朝天,发问者众多 ...

  8. 大数据项目开发案例_大数据开发相关术语解析

    Java['dʒɑːvə] 当前软件开发行业应用最广.就业量最大的编程语言,在各类编程语言排行榜长期位列第一.是企业软件开发的首选语言,也是Android系统的开发语言. Java吸取了C++语言的众 ...

  9. 五、K3 WISE 开发插件《直接SQL报表开发新手指导 - BOM成本报表》

    ======================== 目录: 1.直接SQL报表 ======================== 1.直接SQL报表 以BOM成本报表为例,在销售模块部署,需要购买[金蝶 ...

最新文章

  1. c# 垃圾回收是引用类型而言的
  2. IDEA那些既好用又好玩的30多款宝贝插件,你知道多少?
  3. 关于CCRANDOM_0_1
  4. procreate 笔刷_Procreate笔刷怎么用?初学者必看!!!(含笔刷设置)
  5. IEEE802.11协议栈
  6. 【自动驾驶】毫米波雷达相关知识专题
  7. ABAP report的递归submit和在虚拟机里再次启动另一个虚拟机
  8. fiddler对手机进行抓包
  9. Python 字典 values() 方法
  10. ruby hash方法_Ruby中带有示例的Hash.rassoc(obj)方法
  11. 关于两个list深层遍历
  12. CF 246E. Blood Cousins Return [dsu on tree STL]
  13. RedHat 7 更换 yum 源为 CentOS 或网易镜像源
  14. chrome 迅雷下载 支持插件, 让chrome支持迅雷
  15. 固态硬盘系统经常假死_Win7固态硬盘假死卡顿解决方法
  16. 第09课:一网打尽神经序列模型之 RNN 及其变种 LSTM、GRU
  17. Openstack 高可用部署(Ocata版)
  18. matlab读取wav文件
  19. uniapp权限(Android权限)
  20. 问题解决了,可是为什么呢?could not find the main class.program will exitmain

热门文章

  1. 只读了半年大学的院士——苹果CEO乔布斯
  2. Vscode(arduino框架) 开发ESP32 _01_电容Touch和外部中断
  3. 模态框获取页面请求数据
  4. 面向对象进阶 三大特性
  5. 自然语言处理(NLP)入门(二)
  6. python读取csv表格的数据并用matplotlib画曲线图
  7. python驱动级模拟按键 检测_py库: pyautogui (自动测试模块,模拟鼠标、键盘动作)...
  8. C#获取汉字首字母,多音拼音
  9. 大学四年,我做过哪些兼职
  10. 图解刘谦如何手穿玻璃桌(详细图文说明)