C# RDLC报表使用总结
一、首先.rdlc文件是报表样式文件:他需要使用reportViewer这个控件来显示到winform中。他和咱们的程序可以说是完全独立的,他可以不包含在项目里,可以使用VS带的视图编辑器和xml编辑器修改他,也可以使用UE等单独打开编辑他。他和咱们程序唯一的结合就是reportviewer控件里要指定所显示的rdlc文件路径,其二就是他们的数据需要代码中绑定。
二、数据源:在给rdlc设置数据集时必须要有一个数据源来提供数据集的模板样式。(数据源可是是数据库的查询结果,也可以是项目里的其他公开类和引用类。)注意我这里用了设置,而不是绑定,因为绑定实在Form的代码中进行的。
三、rdlc界面设置布局:比较简单不用担心 。报表上要显示的内容按来源大概分四种,
1、内置函数:比如日期,时间、页码这些。此类不需要绑定,直接写函数就可以
2、来自外部固定数量的参数:比如表头有个公司名称字符串,需要从外不传入。可以通过reportViewer.LocalReport.SetParameters(ReportParameter[] p)来传入
其中p是一个ReportParameter类型的数组,有多少个固定参数。我们都可以用这个数组来传给报表。传之前需要在Form的代码里将参数与rdlc中设置的参数名称一 一对应绑定好。
如下。
参数列表[0] = new ReportParameter("公司名称", companyName);//将本地变量 “companyName”绑定给rdlc中的已定义好的 参数 “公司名称”
参数列表[1] = new ReportParameter("公司地址", companyAddress);//将本地变量 “companyAddress”绑定给rdlc中的已定义好的 参数 “公司地址”
ReportParameter[] 参数列表 = new ReportParameter[2];// 有2个固定参数传入报表
3、来自行数不固定的数据集:比如来自数据库、自定义DataTable等变量的。这类的特点就是行数不确定,这就需要另一种绑定方式 将数据绑定到rdlc中定义好的数据集中。一个rdlc表格可以绑定多个数据集。
reportViewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet_员工信息", dt_员工信息表)); //参数1:rdlc中定义好的数据集名称 参数2. 本地数据对象名称
reportViewer.LocalReport.DataSources.Add(new Microsoft.Reporting.WinForms.ReportDataSource("DataSet_产品信息", dt_产品信息表)); //将产品信息表与rdlc中定义好的 产品数据集绑定。
4、第四种是比较特殊的图片绑定。本地图片的话直接在rdlc的图片控件的图片属性--选择图片来源 选为”嵌入” ,然后从本地磁盘导入即可。如果是数据库或程序对象中的图片,需要在绑定前先将图片转换为str64 这种字符串格式。再绑定到rdlc ,将在rdlc的图片空间中的MEMI中设置好解码后的格式,。显示时rdlc通过设置的MEMI格式再解码后显示出来。
了解以上这几点,下面我们来看开发一个WinForm报表程序的具体的具体步骤就容易多了
四、报表程序开发步骤
1、项目右键--添加--数据源,即数据模板。 常用是通过数据库查询得到的DataTalbe和通过对象得到的项目里的自定义类, (相当于声明只有格式没有内容的空数据)
其中,数据库得到的比较简单,网上教程也很多,不做累述,而有时候我们希望报表显示一些在程序允许过程中产生的数量不定的数据时则会用到通过对象产生的数据,比如一组学生的信息等。我们的思路就是新建一个自定义的student公开类。在程序运行过程中将产生的学生信息集通过一个泛型数组List<Student> listStudents 或者是定长数组 Student[] arrayStudents 保存,再将它绑定给rdlc中已定义号的数据集即可。
2、项目右键--添加 rdlc报表(添加完后是一个.rdlc的文件,先不要着急绘制表格,先把需要的固定参数和数据集都新建出来。其中数据集新建时会用的第一步新建的数据源,说白了就是用它做模板,然后再绘制表格,绘制时会用到之前新建的数据集字段等,拖进去即可)
3、在Form中添加reportViewer控件,将rdlc文件指定给此控件 。也可以在代码中给改指定的rdlc.
4、在Form中将数据同rdlc文件中定义的变量或数据集绑定。(两种绑定方式,如果固定参数就用reportParameter绑定,如果是变化行的数据就用 DataSources.add()来绑定;