介绍
最近项目中要用到报表的分组显示,觉得rdlc报表功能比较强大,就尝试用它来实现一下。实现方式也是有很多种,下面一一介绍。
创建分组后的数据库表
自己计算相对麻烦些,可以在数据库先创建一张表每班汇总信息(EveryTotalInfo),然后创建一个与该表对应的数据集xxx.xsd文件,在数据集中添加该表需要展示的哪些字段(注意字段类型必须与数据库中的一致):
下面的适配器中添加一个带时间参数(@getTime)的获取方法,注意类型是日期时间类型(DateTime):
然后打开rdlc文件,在“报表数据”页面新建数据集:
数据源类型选择数据库:
数据库模型选择:
在选择数据库对象时,把我们新创建的表EveryTotalInfo选中:
点击完成后,会生成名为“DataSet1”(名字可以自己改)的数据集,属性如下:
在“工具箱”页面拖入一个“表”控件:
这时表文本里面就可以添加数据库对应表的字段了:
最后表的样式如下图所示:
我们代码中先计算好分组后的数据,然后插入到EveryTotalInfo表中,要显示的时候,只需给EveryTotalInfoTableAdapter适配器传入表集合和参数即可:
this.everyTotalInfoTableAdapter.Fill(byGsDataSet1.EveryTotalInfo, time);
this.reportViewer1.RefreshReport();
这里的time就是之前定义的DateTime类型的@getTime参数,其作为查询条件,展示表中的数据,下面是展示的结果:
看到这里,实际上数据库中EveryTotalInfo表只是起到中间存放的作用,那么我们可不可以不创建表,直接代码中计算后添加到数据集当中呢?答案是肯定的。下面来介绍第二种方法。
不使用数据库表数据展示
不需要先在数据库中建表,直接在数据集xxx.xsd文件中添加展示字段:
和刚才一样,在rlcd文件中关联数据集,做好展示页面:
那么代码中如何更新这个数据集的内容呢?实际上就是取代这个与rlcd关联的数据库(比如名为ByGsDataSet2):
// 创建新数据表
ByGsDataSet2 ds = new ByGsDataSet2();
…
// 有多少张卡添加多少行数据
for (int i = 0; i < cards.Count; i++)
{
DataRow newRow = ds.CardStatis.NewRow();
newRow["CardNumber"] = cardNum;
…
ds.CardStatis.Rows.Add(newRow);
}
…
Microsoft.Reporting.WinForms.ReportDataSource dataSource = new Microsoft.Reporting.WinForms.ReportDataSource("DataSet3", ds.Tables["CardStatis"]);
if (this.reportViewer1.LocalReport.DataSources.Count > 1) // 重新添加数据
this.reportViewer1.LocalReport.DataSources.RemoveAt(1);
this.reportViewer1.LocalReport.DataSources.Add(dataSource);
在添加数据集的时候,要注意“重新添加数据”的代码,这是判断数据集是否已经存在了,如果存在就先移除再添加。如果没有这行代码,第一次展示时没问题,如果数据变动后重新计算再添加就会出错的。
最后展示结果如下:
使用rdlc自带分组功能
在要分组的行上右键选择“添加组”->“父组…”:
然后添加分组依据的表字段(这里以加气类型为依据):
组内详细信息里面也需要有个排列顺序,这里按枪号排序,选中刚才的父组行,右键“添加组”->“子组…”:
然后添加分组依据的表字段(这里选择枪号对于的数据库字段):
我们要按照枪号由小到大进行排序显示的话,右键报表,选择“Tablix属性”:
然后选中排序依据的字段,顺序是从A到Z:
这样运行报表效果:
可以看到展示数据已经按照不同的品类进行分组显示了,这里只有个总计,如果我们还需要在组内进行小计该怎么办呢?
要在组内进行小计,需要右键在组内添加行:
然后写上汇总公式:=Sum(Fields!FinishTotal.Value-Fields!StartTotal.Value)
注意最后总计的行一定要放在组外,最终样式如下:
再运行一下程序看效果:
这下组内小计和组外总计就全有了
不使用数据库表数据分组
如果自己计算的数据集,也需要添加分组怎么办呢?比如刚才的“员工售气统计表”。首先在数据集xxx.xsd文件中添加分组依据字段(按品类):
然后在rdlc文件中添加展示内容:
没有刚添加的“GasType”字段怎么办,可以在“报表数据”页面刷新一下对应的数据集:
如果还不行,就来强硬的,修改rdlc源代码,在对应的数据集名称下直接添加新插入的字段:
这时再重新打开rdlc文件,就可以看到新添加的字段了:
这时展示的报表并没有分组:
分组操作跟上面讲的一样,右键选择“添加组”->“父组…”,这次分组依据选择卡号:
再运行显示如下:
问题是卡号和名字肯定是一一对应的,卡号分组了,名字就没必要再重复显示了。在品类行上再次添加行父组:
这次分组依据选择姓名,组效果如下图:
再次运行后:
这次卡号和名字都唯一的,只是文字不居中啊,强迫症没办法,在rdlc文本框中右键“文本框属性”:
在对齐项中,看到水平是居中的,把垂直也改为“垂直居中”:
把分组展示的文本框都这样修改后,再次运行:
这次看着舒服多了。。。