如何自动在数据报表中插入【小计】和【总计】行?

摘要:在开发ERP系统的数据报表时,几乎都是需要【小计】、【总计】这样的汇总数据的。手动为每个报表增加汇总行,那将是一份不小的工作量。所以,如果能自动为每个数据报表添加汇总行,那将可以节省不少的开发时间。本文将给出实现这种方案的思路原理以及示例源
在开发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> /// 为数据报表增加一个汇总行。
阅读全文