ReportViewer动态加载数据源
ReportViewer主要用于打印和导出数据到pdf或excel,接下来将简单做一张Northwind的Products表的统计报表。
(最终图)
一、新建一张报表
二、添加数据集
添加xsd文件后,有两种添加数据集的方式。
第一种从工具箱中添加TableAdapter,通过sql语句连接数据库绑定数据集。
第二种添加DataTable后,手动加上需要绑定的字段,然后通过BLL层的方法返回对象绑定数据源,接下来都将采用第二种方法。
(Productid的DataType为Int32,Unitprice的DataType为Double,Unitsinstock的DataType为Int32)
三、设计报表
从工具箱中添加 表 到报表上,此处有两行即表头和数据,为了之后统计需要我们在组外部再添加一行。
然后在报表数据的数据集点添加数据集
接着从数据集中的字段拖放到表中的列即可绑定字段到表格中,在后来添加的那行,Unitprice那列对应的单元格中选择表达式完成对相应字段的统计。
四、设计Web页面
从工具箱中添加一个ReportViewer控件,点击其右上方三角,选择刚刚建立的那张报表。
这是页面上会多出一个ObjectDataSource1控件是用来获取数据的,我们手动赋值,所以就不用了,删除它。
接下来手动绑定数据到报表,代码如下:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Data; using BLL; using Model; using Microsoft.Reporting.WebForms; public partial class Rpt : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { DataTable dt = getProducts(); ReportDataSource rds = new ReportDataSource("DataSet1_DataTable1", dt); ReportViewer1.LocalReport.DataSources.Clear(); ReportViewer1.LocalReport.DataSources.Add(rds); ReportViewer1.LocalReport.Refresh(); } } public static DataTable getProducts() { //添加DataTable表列名匹配字段 DataTable dt = new DataTable("Products"); dt.Columns.Add("Productid",typeof(Int32)); dt.Columns.Add("Productname",typeof(string)); dt.Columns.Add("Quantityperunit",typeof(string)); dt.Columns.Add("Unitprice",typeof(double)); dt.Columns.Add("Unitsinstock",typeof(Int32)); dt.Columns.Add("Categoryname",typeof(string)); //从BLL调用方法返回产品 List<Products> products = ProductsManage.GetAllProducts(); //将实体对象转化到DataTable for (int i = 0; i < products.Count; i++) { DataRow dr = dt.NewRow(); dr["Productid"] = Convert.ToInt32(products[i].Productid); dr["Productname"] = products[i].Productname.ToString(); dr["Quantityperunit"] = products[i].Quantityperunit.ToString(); dr["Unitprice"] = Convert.ToDouble(products[i].Unitprice); dr["Unitsinstock"] = Convert.ToInt32(products[i].Unitsinstock); dr["Categoryname"] = products[i].Category.Categoryname.ToString(); dt.Rows.Add(dr); } return dt; } }
值得注意的是:我上面标出的ReportDataSource rds = new ReportDataSource("DataSet1_DataTable1", dt);必须与html中 <rsweb:ReportDataSource DataSourceId="ObjectDataSource1" Name="DataSet1_DataTable1" />对应。
如果运行后出现
在 Web 窗体上报表查看器 Web 控件需要 System.Web.UI.ScriptManager
则手动添加一个即可。