ReportViewer动态加载数据源

  ReportViewer主要用于打印和导出数据到pdf或excel,接下来将简单做一张Northwind的Products表的统计报表。  

ReportViewer动态加载数据源_第1张图片

                                                         (最终图)

一、新建一张报表

ReportViewer动态加载数据源_第2张图片

二、添加数据集

ReportViewer动态加载数据源_第3张图片

添加xsd文件后,有两种添加数据集的方式。

第一种从工具箱中添加TableAdapter,通过sql语句连接数据库绑定数据集。

第二种添加DataTable后,手动加上需要绑定的字段,然后通过BLL层的方法返回对象绑定数据源,接下来都将采用第二种方法。

ReportViewer动态加载数据源_第4张图片        ReportViewer动态加载数据源_第5张图片

(Productid的DataType为Int32,Unitprice的DataType为Double,Unitsinstock的DataType为Int32)

三、设计报表

从工具箱中添加 表 到报表上,此处有两行即表头和数据,为了之后统计需要我们在组外部再添加一行。

然后在报表数据的数据集点添加数据集

ReportViewer动态加载数据源_第6张图片

接着从数据集中的字段拖放到表中的列即可绑定字段到表格中,在后来添加的那行,Unitprice那列对应的单元格中选择表达式完成对相应字段的统计。

ReportViewer动态加载数据源_第7张图片

四、设计Web页面

从工具箱中添加一个ReportViewer控件,点击其右上方三角,选择刚刚建立的那张报表。

ReportViewer动态加载数据源_第8张图片

这是页面上会多出一个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

则手动添加一个即可。

 

 

你可能感兴趣的:(view)