C#的rdlc报表分组汇总学习

本文详细介绍RDLC报表的多种数据展示方法,包括使用数据库表分组、直接代码计算分组及利用RDLC自带分组功能。通过实例演示如何在报表中实现分组显示、小计与总计功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

介绍

最近项目中要用到报表的分组显示,觉得rdlc报表功能比较强大,就尝试用它来实现一下。实现方式也是有很多种,下面一一介绍。

创建分组后的数据库表

自己计算相对麻烦些,可以在数据库先创建一张表每班汇总信息(EveryTotalInfo),然后创建一个与该表对应的数据集xxx.xsd文件,在数据集中添加该表需要展示的哪些字段(注意字段类型必须与数据库中的一致):
数据集表
下面的适配器中添加一个带时间参数(@getTime)的获取方法,注意类型是日期时间类型(DateTime):
参数类型
然后打开rdlc文件,在“报表数据”页面新建数据集:
新建数据集
数据源类型选择数据库:
选择数据库
数据库模型选择:
模型选择
在选择数据库对象时,把我们新创建的表EveryTotalInfo选中:
表选择
点击完成后,会生成名为“DataSet1”(名字可以自己改)的数据集,属性如下:
属性
在“工具箱”页面拖入一个“表”控件:
插入表
这时表文本里面就可以添加数据库对应表的字段了:
显示对应字段
最后表的样式如下图所示:
完整表结构
我们代码中先计算好分组后的数据,然后插入到EveryTotalInfo表中,要显示的时候,只需给EveryTotalInfoTableAdapter适配器传入表集合和参数即可:
this.everyTotalInfoTableAdapter.Fill(byGsDataSet1.EveryTotalInfo, time);
this.reportViewer1.RefreshReport();
这里的time就是之前定义的DateTime类型的@getTime参数,其作为查询条件,展示表中的数据,下面是展示的结果:
展示样式1
看到这里,实际上数据库中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

使用rdlc自带分组功能

在要分组的行上右键选择“添加组”->“父组…”:
添加父组
然后添加分组依据的表字段(这里以加气类型为依据):
分组依据
组内详细信息里面也需要有个排列顺序,这里按枪号排序,选中刚才的父组行,右键“添加组”->“子组…”:
添加子组
然后添加分组依据的表字段(这里选择枪号对于的数据库字段):
分组依据
我们要按照枪号由小到大进行排序显示的话,右键报表,选择“Tablix属性”:
表属性
然后选中排序依据的字段,顺序是从A到Z:
排序
这样运行报表效果:
展示样式3
可以看到展示数据已经按照不同的品类进行分组显示了,这里只有个总计,如果我们还需要在组内进行小计该怎么办呢?
要在组内进行小计,需要右键在组内添加行:
插入组内行
然后写上汇总公式:=Sum(Fields!FinishTotal.Value-Fields!StartTotal.Value)
小计公式
注意最后总计的行一定要放在组外,最终样式如下:
最终样式
再运行一下程序看效果:
展示样式4
这下组内小计和组外总计就全有了

不使用数据库表数据分组

如果自己计算的数据集,也需要添加分组怎么办呢?比如刚才的“员工售气统计表”。首先在数据集xxx.xsd文件中添加分组依据字段(按品类):
数据集增加字段
然后在rdlc文件中添加展示内容:
展示报表
没有刚添加的“GasType”字段怎么办,可以在“报表数据”页面刷新一下对应的数据集:
数据集刷新
如果还不行,就来强硬的,修改rdlc源代码,在对应的数据集名称下直接添加新插入的字段:
手动修改
这时再重新打开rdlc文件,就可以看到新添加的字段了:
新加字段出现
这时展示的报表并没有分组:
未分组展示
分组操作跟上面讲的一样,右键选择“添加组”->“父组…”,这次分组依据选择卡号:
增加父组
再运行显示如下:
分组显示
问题是卡号和名字肯定是一一对应的,卡号分组了,名字就没必要再重复显示了。在品类行上再次添加行父组:
再增加父组
这次分组依据选择姓名,组效果如下图:
组效果图
再次运行后:
分组显示
这次卡号和名字都唯一的,只是文字不居中啊,强迫症没办法,在rdlc文本框中右键“文本框属性”:
文本属性
在对齐项中,看到水平是居中的,把垂直也改为“垂直居中”:
选择居中对齐
把分组展示的文本框都这样修改后,再次运行:
对齐显示
这次看着舒服多了。。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值