Advertisement

利用数据集在水晶报表中显示图像的 .NET 程序教程

阅读量:

该 C# .NET Windows 程序演示了如何通过 VB.NET 创建数据集,添加图像到数据集,并将数据集传递到子报表。文件列表包括用于操作的图像文件和中间文件,如 DynamicImage.xsd。步骤包括创建数据集函数、调用函数生成报告、设计报表并使用 Crystal Report Viewer 连接数据集。代码展示了如何使用 CrystalDecisions 工具创建和管理报表。

目录

描述
文件列表
步骤
Form1.cs
VB.NET

描述

该 C# .NET Windows 程序展示了数据集创建的过程,并将图像加入到数据集中,同时在运行时将数据集发送给子报表。

文件列表

Debug Bin Canada.jpg

Form 1.cs

Debug Bin Canada.jpg

步骤

*** 开始一个新项目/创建数据集及其模式**

  • 新建项目
  • 在Form1.cs后置的代码区域中,添加以下代码:
    • 在代码段顶部添加以下using语句:using System.Data; using System.IO;
    • 定义一个静态函数 named CreateData,用于创建数据集
    • 通过调用该函数,可以生成所需的完整数据集

DataSet CreateData()
{
实例化为新DataSet;
将"Images"添加到data的表中;
在第一张表中,添加字段"Country",其类型为System.String;
在第一张表中,添加字段"img",其类型为System.Byte[];
生成带有路径"DynamicImage.xsd"的XML schema;
}

- 创建函数 "CreateReport",以调用 CreateData 创建数据集模式:

void CreateReport()
{
CreateData();
}

在构造函数中执行CreateReport

public Form1()
{
//
// 注释:支持Windows Form Designer
//
// 注释说明:初始化组件
InitializeComponent();

TODO: Implement the constructor code for any after the InitializeComponent method has been called

TODO: Implement the constructor code for any after the InitializeComponent method has been called

- 构造并执行程序/将在 Bin/Debug 文件夹中创建 DynamicImage.xsd。

*** 设计报表**

在项目列表中添加一项
选择 Crystal Report,点击打开按钮
在“作为空白报表”选项卡中选择该选项,并点击确定按钮
右键点击任意空白区域,选择“数据库->添加/删除数据库”
在“ODBC (RDO)”选项卡中展开“数据源”选项组,选择 Xtreme Sample Database 并点击完成按钮
在打开的表列表中双击 Customer 表
点击确定按钮
将 Customer Name 和 Last Year's Sales 字段拖动到详细资料区域
右键点击任意空白区域,在弹出的菜单中选择“插入->子报表”
将子报表放置在 Last Year's Sales 表旁
点击“创建子报表”按钮,并在弹出的对话框中输入“Flags”作为子报表名称
在“报表专家”选项卡中点击“确定”按钮
扩展“更多数据源”选项组,在“ADO.NET (XML)”选项卡中选择 DynamicImage.xsd 文件并点击完成按钮
双击 Images 对象,在“属性”对话框中选择“图片”选项卡
点击“下一步”按钮,双击 img 对象,在“图片属性”对话框中点击“完成”按钮
在“链接”选项卡中双击 Country 对象,并点击“确定”按钮
调整子报表的大小
在子报表上双击打开该子报表
右键点击该子报表,在弹出的菜单中选择“关闭”按钮
删除报表页眉 b 和报表页脚 b
右键点击该子报表,在弹出的菜单中选择“关闭”按钮

*** 回到代码,并编写 Crystal 代码**

将 CrystalReportViewer 控件拖拽至窗体 Form1,选中 CrystalReportViewer1,按 F4 键以进入属性设置。调整 Dock 属性为填充模式,查看代码以获取更多信息。注释掉 WriteXmlSchema 方法(因为此方法仅在生成设计报表时需要用到数据集模式文件),在 CreateData 函数中组装数据集并返回给所需组件。

void AddImageRow(DataTable tbl, string name, string filename)
{
FileStream f = new FileStream(filename, FileMode.Open);
BinaryReader b = new BinaryReader(f);
DataRow rowCopy = tbl.NewRow Copy();
rowCopy[0] = name;
rowCopy[1] = b.ReadBytes((int)b.BaseStream.Length);
tbl.Rows.Add(rowCopy);
br = 0;
fs = 0;
}

DataSet CreateData()
{
var ds = new DataSet();
ds.Tables.Add("Images");
ds.Tables[0].AddColumn("Country", typeof(System.String));
ds.Tables[0].AddColumn("img", typeof(System.Byte[]));
// ds.WriteXmlSchema(Directory.GetCurrentDirectory() + "//DynamicImage.xsd");
ds.AddImageRow("USA", Directory.GetCurrentDirectory() + "//USA.jpg");
ds.AddImageRow("Canada", Directory.GetCurrentDirectory() + "//Canada.jpg");
ds.AddImageRow("Germany", Directory.GetCurrentDirectory() + "//Germany.jpg");
ds.AddImageRow("Japan", Directory.GetCurrentDirectory() + "//Japan.jpg");
return ds;
}

- 创建报表文档,将数据集传递到子报表,并将报表绑定到水晶报表查看器:

此方法用于创建报告。它开始于创建一个新 CrystalReport1 实例。接着,该实例打开名为“Flags”的子报告,并设置其数据源为 CreateData()。最后,将 CrystalReportViewer1 的报告源设置为该实例。

Form1.cs

使用System库,通常以System为别表示;
使用System.Drawing库,常以System.Drawing为别表示;
使用System.Collections库,常以System.Collections为别表示;
使用System.ComponentModel库,常以System.ComponentModel为别表示;
使用System.Windows.Forms库,常以System.Windows.Forms为别表示;
使用System.Data库,常以System.Data为别表示;
使用System.IO库,常以System.IO为别表示。

namespace DynamicImage
{
///


/// 对Form1的简明说明
///

public class Form1 : System.Windows.Forms.Form
{
private CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer1;
///
/// 必要设计变量
///

private System.ComponentModel.Container components = null;

// 过程: AddImageRow
// 读取并添加图像文件至数据表中
//
// 输入参数为DataTable tbl
// name string country
// filename string fileName
//
public static void AddImageRow(DataTable tbl, string name, string fileName)
{
FileStream fs = new FileStream(fileName, FileMode.Open); // 获取文件流
BinaryReader br = new BinaryReader(fs); // 获取二进制读取器
DataRow row;

// 创建一个新的数据行
row = tbl.NewRow();

注:该段代码用于设置两个字段,分别是 country 字段和 image 字段。代码逻辑如下:
将 row 数组的第 0 个元素设置为 name;
将 row 数组的第 1 个元素设置为 br 读取的字节数,其中 (int)br.BaseStream.Length 用于类型转换。

// 将数据行添加到表中
tbl.Rows.Add(row);

// 清除
br = null;
fs = null;
}

名称为CreateData的函数将生成一个数据集,该数据集包含一个表结构,表中包含两个字段,分别为Country类型为字符串,img类型为blob或byte数组。函数将向表中添加四条记录。生成数据集的名称为CreateData。

// 将表 'Images' 添加到数据集
data.Tables.Add("Images");

在数据表中增加两个字段,分别为字符串类型和位数组类型

在数据表中增加两个字段,分别为字符串类型和位数组类型

// 构建数据集模式(该模式被用于设计报表)
// 创建报表后,模式文件将不再必要
// data.WriteXmlSchema(CurrentDirectory + "//DynamicImage.xsd");

Add an image row to the table for the USA at [current directory]/USA.jpg. Add an image row to the table for Canada at [current directory]/Canada.jpg. Add an image row to the table for Germany at [current directory]/Germany.jpg. Add an image row to the table for Japan at [current directory]/Japan.jpg.

return (data);
}

// 过程: GenerateReport
// 生成报告,同时传递数据集
void GenerateReport()
{
// 生成报告
var CrystalReport1 cr = new CrystalReport1();

// 将由函数CreateData创建的数据集传递给'Flags'子报表
cr.OpenSubreport('Flags').SetDataSource(CreateData());

// 将数据集(由CreateData函数生成)传递给子报表"Flags"
cr.OpenSubreport("Flags").SetDataSource(CreateData());

// 将报表文档传递到查看器
crystalReportViewer1.ReportSource = cr;
}

public Form1()
{
//
// 支持Windows Form Designer设计
//
注释块位于方法体前
InitializeComponent();

//
// 在 InitializeComponent 调用后添加任何构造函数代码
//
CreateReport();
}

后面的部分省略……

VB.NET

该资源可通过FTP从Business Objects的Devzone下载,文件位于...

全部评论 (0)

还没有任何评论哟~