之前做机房时使用的Grid++报表,现在重构时使用Visual Studio,当然得使使它自带的rdlc报表。开始在网上找资料时,搜索的关键词一直是reportviewer,因为只看到这么一个控件,也不了解它具体是怎么工作的。感觉资料很少,后面才发现搜索rdlc报表时就大不一样了。资料也多起来。reportviewer是用来显示报表的。rdlc是报表文件,它可以嵌在reportviewer中,主要与数据库进行绑定。我以机房收费系统作为一个实例,讲解一下我是如何实现。
1.在UI项目中新建windows窗体文件,命名为frmWeekCheck.vb ,然后再新建一个rdlc文件,命名为WeekCheck.rdlc。效果图如下:
2.添加数据源。给rdlc报表建立数据源和数据集。先配置数据源:如图:
因为之前我已经配置过数据连接,直接选择就可以。如果没有配置过,则通过新建连接,建立。这里不再介绍。
连接到数据库以后,会让你选择你要建立的数据集中包含的对象。这里我选择T-CheckDay表。点击完成即可。
在“报表数据”窗口中添加可以看到你添加的数据源和数据集,这里也可以编辑,操作基本类似。
3.设计rdlc报表。
主要是两种工具:文本框和表。
文本框中可以通过右击“文本框属性”设计一些表达式:比如当前时间。如图:
选择值这一栏的函数按钮,设置函数。如图:
选择Now函数,可以设置当前时间。注意上面的表达式中一定要有“=”。
文本框中也可以添加参数。在“报表数据”窗口中右击参数文件夹,则会出现下图:
当然这里添加了参数,那么在代码中就需要传入参数。随后在代码详细介绍。
显示数据主要的就是表这个工具。当你拖入一个表工具后,如下图:
在红色的框中有一个小小的数据库,单击它选择要添加的字段。那么表头那一栏也相应添加,当然可以修改它的值。默认产生的两行三列的表格。也可以添加行添加列。
4.在frmWeekCheck.vb窗体中,添加按钮的Click事件。代码如下:
Private Sub btnCheck_Click(sender As Object, e As EventArgs) Handles btnCheck.Click
Dim bSCheck As New BLL.CheckBLL
Dim dt As New DataTable
dt = bSCheck.SWeekDay(dtpBeginDate.Text.Trim, dtpEndDate.Text.Trim) '这里是通过数据库查询出我需要的表的内容。
txtRemainCash.Text = dt.Rows(0)(1)
Dim rpDataReport As ReportDataSource = New ReportDataSource("DataSetWeekCheck", dt) '为报表定义一个数据源,以dt来实例化它。
ReportViewer1.Visible = True
Dim rtpParaA As ReportParameter = New ReportParameter("rtpParaBeginDate", dtpBeginDate.Text.Trim) '这里就是定义了一个报表参数,并确定将什么值传入。
Dim rtpParaB As ReportParameter = New ReportParameter("rtpParaEndDate", dtpEndDate.Text.Trim)
ReportViewer1.LocalReport.SetParameters(New ReportParameter() {rtpParaA}) '设置reportviewer控件的参数。当然这里需要相对应。
ReportViewer1.LocalReport.SetParameters(New ReportParameter() {rtpParaB})
ReportViewer1.LocalReport.DataSources.Clear()
ReportViewer1.LocalReport.DataSources.Add(rpDataReport) '这里将报表设定为Reportviewer的数据源。
ReportViewer1.RefreshReport()
End Sub
5.总结:开始的时候特别晕,总结后就渐渐清晰了。其实有三层关系:reportviewer控件,rdlc报表,数据库。我们要将数据库中的某些元素作为数据源添加到rdlc报表中。而报表本身也是reportviewer控件的数据源。在代码中体现得最为明显:
Dim rpDataReport As ReportDataSource = New ReportDataSource("DataSetWeekCheck", dt)
ReportViewer1.LocalReport.DataSources.Add(rpDataReport)