水晶报表技术(3)——.NET 2005 中动态水晶报表的实现

简介:

.NET 2005 中动态水晶报表的实现

简介
本程序演示如何动态地从数据库读入数据,并应用到水晶报表中。通过使用本程序,我们可以在应用程序的运行时刻定制水晶报表,限定只有那些被指定的字段(特定表的列)才显示在报表中。
 
背景
这一问题起因于一些 SLIIT 的学生询问我该如何使用 C 2.0 动态地产生水晶报表。为了解决这个问题,我试着搜索了很多论坛和网站,但是很不幸,我没能找到任何的解决办法。在一些论坛中有人说,在 .NET 2005 中不可能创建动态的水晶报表。后来,我找到了解决办法。
 
代码使用
1.创建一个 C# 项目(本例中项目名称为app5),或添加窗体到已有项目中。 现在,你可以添加与表的字段相对应的复选框到窗体中,这些字段将被显示在水晶报表和水晶报表查看器(CrystalReportViewer)控件中。
 
在本例中,我已经使用 Access 创建了一个名为 db1.mdb 的数据库,以及一个名为 Customer 的表。 在 Customer 表中包含如下 5 个字段:Code FirstNameLastNameAddressPhone
 
2. 在解决方案资源管理器中使用“添加—新建项”功能,添加一个数据集(.xsd 文件本例中数据集名称为DataSet1) 到项目中,然后添加一个数据表(DataTable,本例中数据表名称为Customer) 到数据集中。
添加列到数据表(DataTable) 中,并命名为 Column1, Column2 … 等等。列的数目取决于将有多少列被显示在水晶报表中。
 
3.添加一个水晶报表到项目中(译者注:在解决方案资源管理器中使用“添加—新建项”功能添加),使用报表向导,先选择水晶报表的数据源(本例为“项目数据 — ADO.NET 数据集 —  app5.DataSet1),并选定要在水晶报表中显示的表(本例为 Customer);单击[下一步]按钮。
 
接下来在向导中选择要在报表中显示的字段,如下图所示。在单击向导的[完成]按钮后,报表就会自动生成。在报表的Section2(页眉带区)中,删除下列文本对象(即报表列的名称或标题)Column1, Column2...Column5
 
4. 现在在字段资源管理器中添加如下参数字段(parameter fields) col1, col2 col5 (参数字段的数目应该等于显示在水晶报表中的列的数目),并把它们放置到Section2 (页眉带区)中,与对应的报表列对齐
 
5. 添加下列方法到窗体中,以便于根据用户选定的报表列,创建 SQL SELECT 查询,并赋值到水晶报表的参数字段。 
 
// ///
/// 本方法用于:
/// 1. 根据用户选定的字段名,创建 SELECT 查询
/// 2. 与水晶报表中的参数字段相对应,创建参数并赋值给它们
/// 说明根据用户的选择,这些参数用于显示水晶报表中的列名称(标题)
///
///
private string CreateSelectQueryAndParameters()
{
ReportDocument reportDocument;
ParameterFields paramFields;
ParameterField paramField;
ParameterDiscreteValue paramDiscreteValue;
reportDocument = new ReportDocument();
paramFields = new ParameterFields();
string query = "SELECT ";
 int columnNo = 0;
 
 if (chbCode.Checked)
 {
 columnNo++;
 query = query.Insert(query.Length, "Code as Column" + columnNo.ToString());
 
 
 paramField = new ParameterField();
 paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "Customer Code";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields 
paramFields.Add(paramField);
}
if (chbFirstName.Checked)
{
columnNo++;
if (query.Contains("Column"))
 {
 query = query.Insert(query.Length, ", ");
 }
 query = query.Insert(query.Length, "FirstName as Column" + columnNo.ToString());
 
 
 paramField = new ParameterField();
 paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "First Name";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields
paramFields.Add(paramField);
}
if (chbLastName.Checked)
{
columnNo++; //确定列的数目
if (query.Contains("Column"))
 {
 query = query.Insert(query.Length, ", ");
 }
 query = query.Insert(query.Length, "LastName as Column" + columnNo.ToString());
 
 
 paramField = new ParameterField();
 paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "Last Name";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields
paramFields.Add(paramField);
}
if (chbAddress.Checked)
{
columnNo++;
if (query.Contains("Column"))
 {
 query = query.Insert(query.Length, ", ");
 }
 query = query.Insert(query.Length, "Address as Column" + columnNo.ToString());
 
 
 paramField = new ParameterField();
 paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "Address";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields
paramFields.Add(paramField);
}
if (chbPhone.Checked)
{
columnNo++;
if (query.Contains("Column"))
 {
 query = query.Insert(query.Length, ", ");
 }
 query = query.Insert(query.Length, "Phone as Column" + columnNo.ToString());
 
 
 paramField = new ParameterField();
 paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "Phone";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields
paramFields.Add(paramField);
}
//如果还有其他参数,为它们赋空值(empty value)
for (int i = columnNo; i < 5; i++)
{
columnNo++;
paramField = new ParameterField();
paramField.Name = "col" + columnNo.ToString();
 paramDiscreteValue = new ParameterDiscreteValue();
 paramDiscreteValue.Value = "";
 paramField.CurrentValues.Add(paramDiscreteValue);
 // paramField 添加到 paramFields
paramFields.Add(paramField);
}
crystalReportViewer1.ParameterFieldInfo = paramFields;
query += " FROM Customer" ;
 return query;
 }
// 
 
6. 添加下列方法到预览报表按钮的 click 事件代码中,以便于在用户按下此按钮时显示报表
 
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;
 
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.ReportSource;
using CrystalDecisions.Shared;
using CrystalDecisions.Windows.Forms;
 
namespace app5
{
 public partial class Form1 : Form
 {
 CrystalReport1 objRpt;
 
 public Form1()
 {
 InitializeComponent();
 }
 
 private void button1_Click(object sender, EventArgs e)
 {
 objRpt = new CrystalReport1();
 
 string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\\db1.mdb";
 
 // Select 查询字符串,并添加参数到水晶报表
string query = CreateSelectQueryAndParameters();
//如果没有选定项,则退出
if (!query.Contains("Column"))
 {
 MessageBox.Show("No selection to display!");
 return;
 }
 
 try
 {
 OleDbConnection Conn = new OleDbConnection(connString);
 
 OleDbDataAdapter adepter = new OleDbDataAdapter(query, connString);
 DataSet1 Ds = new DataSet1();
 
 adepter.Fill(Ds, "Customer");
 
 objRpt.SetDataSource(Ds);
 crystalReportViewer1.ReportSource = objRpt;
 }
 catch (OleDbException oleEx)
 {
 MessageBox.Show(oleEx.Message);
 }
 catch (Exception Ex)
 {
 MessageBox.Show(Ex.Message);
 }
 }




本文转自 qianshao 51CTO博客,原文链接:http://blog.51cto.com/qianshao/203440,如需转载请自行联系原作者

目录
相关文章
|
29天前
|
自然语言处理 物联网 图形学
.NET 技术凭借其独特的优势和特性,为开发者们提供了一种高效、可靠且富有创造力的开发体验
本文深入探讨了.NET技术的独特优势及其在多个领域的应用,包括企业级应用、Web应用、桌面应用、移动应用和游戏开发。通过强大的工具集、高效的代码管理、跨平台支持及稳定的性能,.NET为开发者提供了高效、可靠的开发体验,并面对技术更新和竞争压力,不断创新发展。
47 7
|
28天前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
24 5
|
28天前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
30 4
|
28天前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
27 4
|
29天前
|
机器学习/深度学习 人工智能 物联网
.NET 技术:引领未来开发潮流
.NET 技术以其跨平台兼容性、高效的开发体验、强大的性能表现和安全可靠的架构,成为引领未来开发潮流的重要力量。本文深入探讨了 .NET 的核心优势与特点,及其在企业级应用、移动开发、云计算、人工智能等领域的广泛应用,展示了其卓越的应用价值和未来发展前景。
59 5
|
28天前
|
机器学习/深度学习 人工智能 Cloud Native
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台
在数字化时代,.NET 技术凭借其跨平台兼容性、丰富的类库和工具集以及卓越的性能与效率,成为软件开发的重要平台。本文深入解析 .NET 的核心优势,探讨其在企业级应用、Web 开发及移动应用等领域的应用案例,并展望未来在人工智能、云原生等方面的发展趋势。
34 3
|
28天前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
24 3
|
28天前
|
开发框架 安全 Java
.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力
本文深入探讨了.NET技术的独特魅力与优势,涵盖高效的开发体验、强大的性能表现、高度的可扩展性及丰富的生态系统等方面,展示了其在软件开发领域的核心竞争力。.NET不仅支持跨平台开发,具备出色的安全性和稳定性,还能与多种技术无缝集成,为企业级应用提供全面支持。
30 3
|
1月前
|
人工智能 开发框架 前端开发
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
C#/.NET/.NET Core技术前沿周刊 | 第 12 期(2024年11.01-11.10)
|
1月前
|
人工智能 开发框架 安全
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)
C#/.NET/.NET Core技术前沿周刊 | 第 13 期(2024年11.11-11.17)