介绍
最近项目中要用到报表的分组显示,觉得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);
在添加数据集的时候,要注意“重新添加数据”的代码,这是判断数据集是否已经存在了,如果存在就先移除再添加。如果没有这行代码,第一次展示时没问题,如果数据变动后重新计算再添加就会出错的。 最后展示结果如下: ![展示样式2](https://img-blog.csdnimg.cn/2019042417021150.png)
使用rdlc自带分组功能
在要分组的行上右键选择“添加组”->“父组…”: 然后添加分组依据的表字段(这里以加气类型为依据): 组内详细信息里面也需要有个排列顺序,这里按枪号排序,选中刚才的父组行,右键“添加组”->“子组…”: 然后添加分组依据的表字段(这里选择枪号对于的数据库字段): 我们要按照枪号由小到大进行排序显示的话,右键报表,选择“Tablix属性”: 然后选中排序依据的字段,顺序是从A到Z: 这样运行报表效果: 可以看到展示数据已经按照不同的品类进行分组显示了,这里只有个总计,如果我们还需要在组内进行小计该怎么办呢? 要在组内进行小计,需要右键在组内添加行: 然后写上汇总公式:=Sum(Fields!FinishTotal.Value-Fields!StartTotal.Value) 注意最后总计的行一定要放在组外,最终样式如下: 再运行一下程序看效果: 这下组内小计和组外总计就全有了
不使用数据库表数据分组
如果自己计算的数据集,也需要添加分组怎么办呢?比如刚才的“员工售气统计表”。首先在数据集xxx.xsd文件中添加分组依据字段(按品类): 然后在rdlc文件中添加展示内容: 没有刚添加的“GasType”字段怎么办,可以在“报表数据”页面刷新一下对应的数据集: 如果还不行,就来强硬的,修改rdlc源代码,在对应的数据集名称下直接添加新插入的字段: 这时再重新打开rdlc文件,就可以看到新添加的字段了: 这时展示的报表并没有分组: 分组操作跟上面讲的一样,右键选择“添加组”->“父组…”,这次分组依据选择卡号: 再运行显示如下: 问题是卡号和名字肯定是一一对应的,卡号分组了,名字就没必要再重复显示了。在品类行上再次添加行父组: 这次分组依据选择姓名,组效果如下图: 再次运行后: 这次卡号和名字都唯一的,只是文字不居中啊,强迫症没办法,在rdlc文本框中右键“文本框属性”: 在对齐项中,看到水平是居中的,把垂直也改为“垂直居中”: 把分组展示的文本框都这样修改后,再次运行: 这次看着舒服多了。。。
|