在windows应用程序中用ReportViewer显示程序运行中生成的DataSet中的数据
Posted on 2007-11-18 13:54 xshy 阅读(2373) 评论(1) 编辑 收藏 举报在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的数据对报表进行资料绑定和呈现。详细代码和注释如下:
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
运行效果图: