之前做机房收费系统用的报表是Grid++Report,这次VB.NET重构中用到了VisualStudio自带的报表控件。刚开始当然对这块功能很不熟悉,不过探究了一段时间后还是把它做出来了。
下面把在VisualStudio(我用的是VisualStudio2013,如果与您使用的版本不同,过程中如有不符还请考虑实际情况)中制作报表的过程尽可能详细地记录下来,供初学者学习参考。
做事要有全局观,先看一下成品,做好的报表如下图:
其实能够达到这样的效果需要做两方面的工作:添加报表控件ReportViewer和添加编辑RDLC文件。个人感觉RDLC文件的作用是绑定数据库中需要的数据,ReportViewer则是引用RDLC文件来显示RDLC文件从数据库中绑定的数据。
1、添加报表控件ReportViewer:
添加报表控件很简单:工具箱—报表—ReportViewer控件。
2、添加和编辑编辑RDLC文件:
@H_502_65@@H_502_65@ 如图片左上角所示,系统默认新建的这个数据集名称为“DataSet1”,为了命名规范,我们先取消“数据源配置向导”这个窗体,重新命名数据集名称,我的命名为DataSetCheckoutReport:
@H_502_65@@H_502_65@ 这个步骤如果您出现了【未能加载文件或程序集“Microsoft.sqlServer.Management.Sdk.Sfc,Version=11.0.0.0,Culture=neutral,PublicKeyToken=89845dcd8080cc91”或它的一个依赖项。系统找不到指定的文件】这个错误,那么可以下载安装SharedManagementObject.msi。
@H_502_65@@H_502_65@ 将需要的字段按顺序拖入行组或列组中,由于“∑值”中必须拖入字段,这里我们随便拖入一个字段(如果不需要的话后面还可以改),一直点“下一步”,直到“完成”,RDLC文件的雏形就出来了:
@H_502_65@@H_502_65@ 这里我们不需要用到对每列的sum,所以右键表格的每个行和最后一列不需要的行和列删除,只留下需要的行和列(或者直接把这个表删除,右键插入新的表,然后根据自己的需要编辑),我设计好的表为:
@H_502_65@@H_502_65@ 第一行为列标题,第二行为数据关联行,即与数据库中数据的关联,鼠标放到第二行每个单元格时,单元格右上角会出现一个小图标,点击则可以为该单元格以及该单元格所在的整列关联数据集中的数据。
@H_502_65@@H_502_65@ 添加内置字段:如上图,右下角的《Exp》就是报表中自带的函数,可以在【报表数据】的内置字段中添加,比如我在右下角的这个Exp就是要显示执行报表的时间,时间格式可以自己设定,右键《Exp》—表达式,在“为以下项设置表达式”下输入表达式即可,如我想让它显示的时间格式为“2014-08-08 08:08:08”,则可输入“=Format(Now,"yyyy-MM-dd hh:mm:ss")”;
@H_502_65@@H_502_65@ 添加参数:另外前面带有@的表达式,就是您的程序中将要传入报表中的参数,比如我想在报表左下角显示制作这个报表的操作员,而这个操作员的用户名只能从程序中获取,上面的开始日期@startTime和截止日期@endTime也是需要从代码中传入。这类参数可以右击【报表数据】的“参数”,来添加参数。
@H_502_65@@H_502_65@
温馨提示 :代码中的数据集名称@H_502_65@DataSetCheckoutReport一定要与刚开始创建RDLC文件时设定的数据集名称DataSetCheckoutReport一样,否则将会出现“尚未为数据源***提供数据源实例”的错误。
Private Sub btnRefresh_Click(sender As Object,e As EventArgs) Handles btnRefresh.Click '根据时间段查询结账记录 Dim startTime As String = Format(dtpBegin.Value,"yyyy-MM-dd") Dim endTime As String = Format(dtpEnd.Value,"yyyy-MM-dd") Dim dt As New DataTable '对象【checkReportFacade】的【QueryCheckOut】方法功能是根据两个日期,查询此时间段的结账记录 dt = checkReportFacade.QueryCheckOut(startTime,endTime) '声明一个报表数据源对象 Dim rptDateSource = New ReportDataSource '设置报表数据集名称 rptDateSource.Name = "DataSetCheckoutReport" '设置报表数据源实例 rptDateSource.Value = dt '设置嵌入报表的资源名称 reportViewer.LocalReport.ReportEmbeddedResource = "UI.CheckReport.rdlc" '清空报表数据源 reportViewer.LocalReport.DataSources.Clear() '添加报表数据源 reportViewer.LocalReport.DataSources.Add(rptDateSource) '设置报表中的参数集合(注意:这里的参数和报表中的参数大小写和数据类型都要一致) Dim strUserID As String = Entity.UtilUserEntity.UtilUser.UserID Dim params As ReportParameter() params = {New ReportParameter("startTime",startTime),New ReportParameter("endTime",endTime),New ReportParameter("userId",strUserID)} '传递报表中的参数集合 reportViewer.LocalReport.SetParameters(params) '刷新报表 Me.reportViewer.RefreshReport() End Sub
温馨提示 :代码中的数据集名称@H_502_65@DataSetCheckoutReport一定要与刚开始创建RDLC文件时设定的数据集名称DataSetCheckoutReport一样,否则将会出现“尚未为数据源***提供数据源实例”的错误。