博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

在VS2005平台中,虽然可以根据它提供的一系列向导生成rdlc报表文件,而且在把该报表文件绑定到ReportViewer控件时,也可以填充数据源并配置查询条件。但是我们大多时候希望动态地生成查询结果,然后将查询结果(一般是DataSet)交给ReportViewer显示。本文以windows应用程序为例实现了这个功能,Web应用程序道理类似。

1,  新建一个windows应用程序,命名为report

2,  将工具箱-数据下的ReportViewer控件拖入窗体Form1的设计器中。点击右上角的小三角图标展开ReportViewer任务 快捷菜单,选择 设计新报表,此时会打开报表Report1.rdlc设计界面。

3,  此时如果项目中已经有存在的数据源可以直接使用,report项目中没有已经做好的数据源,所以需要新建数据源。这里我们选择 添加新数据源,会出现数据源配置向导,选择从 数据库 获得数据,下一步选择或新建数据连接(这里以连接到ibm服务器上的NorthWind数据库为例),填写好连接信息,选择在连接字符串中包含连接信息中的敏感数据这个复选项,下一步出现所连接数据库中的所有数据对象,包括表、视图、存储过程、函数。在所有表中选中Customers这张表,给DataSet命名为CustomDS。点完成生成数据集CustomDS,保存结果。

4,  双击Report1.rdlc,打开报表设计界面,将此时的报表设计工具箱中的 报表项   拖入 报表设计界面。选择数据菜单下的显示数据源,可以在数据源下看到CustomDS中包含Customers及其所有字段,任意选其中的多个字段将其拖入Report1.rdlc设计界面的表的详细资料 用于报表显示。这里应该选希望用于生成报表的所有字段,例如我们选前四个字段。保存结果。

5,  回到Form1的设计界面,按第二步中的操作将刚才设计好的Report1.rdlc绑定到ReportViewer1上,为ReportViewer1选择报表后,打开 数据源 为报表的数据源(在我们的例子中是CustomDS_Customers,请记住这个名称,后面编程还要用到!)指定一个实例,为了简单起见,就用我们刚才建立的CustomDS中的Customers表作为数据源实例。此时全部保存结果,编译一下可以看到初步运行结果。

下面,就需要对呈现的报表资料进行定制,也就是用自定义的操作生成符合我们需要的DataSet,然后用此DataSet的数据对报表进行资料绑定和呈现。详细代码和注释如下:

 

 1using System;
 2using System.Collections.Generic;
 3using System.ComponentModel;
 4using System.Data;
 5using System.Drawing;
 6using System.Text;
 7using System.Windows.Forms;
 8using System.Data.SqlClient;
 9using System.Configuration;
10using Microsoft.Reporting.WinForms;
11
12namespace report
13{
14    public partial class Form1 : Form
15    {
16        private SqlConnection connection;
17        
18        public Form1()
19        {
20            InitializeComponent();
21        }

22
23        private void Form1_Load(object sender, EventArgs e)
24        {
25            // TODO: 这行代码将数据加载到表“customDS.Customers”中。您可以根据需要移动或移除它。
26            this.customersTableAdapter.Fill(this.customDS.Customers);
27
28            //通过定义该SQL语句可以实现对报表显示数据的定制,但要注意该语句得到的所有字段必须都是在Report1.rdlc中出现的,否则报表显示不能识别
29            string queryString = "SELECT CustomerID, CompanyName, ContactName,ContactTitle FROM Customers WHERE ContactTitle='Owner'";
30            connection = GetConnection();
31            SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);
32
33            DataSet customers = new DataSet();
34            adapter.Fill(customers,"Customers");
35
36            //此处生成一个新的报表数据源,注意:"CustomDS_Customers"就是reportViewer1绑定的数据源名称,用它和dataset中的datatable作为参数生成报表数据源,
37            //将数据源再指定给reportViewer1,刷新报表。
38            ReportDataSource rds = new ReportDataSource("CustomDS_Customers", customers.Tables[0]);
39            this.reportViewer1.LocalReport.DataSources.Clear();
40            this.reportViewer1.LocalReport.DataSources.Add(rds);
41            this.reportViewer1.RefreshReport();
42        }

43
44        /// <summary>
45        /// 获得数据库连接,为了不在应用程序代码中出现连接字符串以保证安全性,可以从配置文件中检索出连接字符串,
46        /// 这里关键是ConfigurationManager这个类,必须在项目中添加System.Configuration.dll的引用才能使用ConfigurationManager类,
47        /// “report.Properties.Settings.NorthwindConnectionString”串是连接字符串的名称,在项目的配置文件app.config中可以找到。
48        /// </summary>
49        /// <returns></returns>

50
51        private SqlConnection GetConnection()
52        {
53            string connectionString = ConfigurationManager.ConnectionStrings["report.Properties.Settings.NorthwindConnectionString"].ConnectionString;
54            SqlConnection connection = new SqlConnection(connectionString);
55            return connection;
56        }

57    }

58}

59

运行效果图: