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

程序|教程|数据|水晶报表|显示

目录

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

描述

该 C# .NET Windows 程序演示了如何创建数据集,并将图像添加到数据集,以及在运行时将数据集传递到子报表。

文件列表

- bin\Debug\Canada.jpg
- bin\Debug\Germany.jpg
- bin\Debug\Japan.jpg
- bin\Debug\USA.jpg
- App.ico
- AssemblyInfo.cs
- CrystalReport1.cs
- CrystalReport1.rpt
- DynamicImage.csproj
- DynamicImage.csproj.user
- DynamicImage.sln
- Form1.cs
- Form1.resx
- Readme.txt
- Steps.txt

步骤

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

- 新建项目
- 转到 Form1.cs 后置的代码
- Imports System.Data/System.IO
- 创建函数 "CreateData",以创建数据集:

DataSet CreateData()
{
DataSet data = new DataSet();
data.Tables.Add("Images");
data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));
data.WriteXmlSchema(Directory.GetCurrentDirectory() + "\\DynamicImage.xsd");
}

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

void CreateReport()
{
CreateData();
}

- 在构造函数中调用 CreateReport

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
CreateReport();
}

- 构造并执行程序/将在 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 fs = new FileStream(filename, FileMode.Open);
BinaryReader br = new BinaryReader(fs);
DataRow row;
row = tbl.NewRow();
row[0] = name;
row[1] = br.ReadBytes((int)br.BaseStream.Length);
tbl.Rows.Add(row);
br = null;
fs = null;
}

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

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

void CreateReport()
{
CrystalReport1 cr = new CrystalReport1();
cr.OpenSubreport("Flags").SetDataSource(CreateData());
crystalReportViewer1.ReportSource = cr;
}

Form1.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

namespace DynamicImage
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
private CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer1;
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null;

// 过程: AddImageRow
// 读取图像文件,并将其添加到数据集的表中
//
// [in] tbl 数据表
// country 国家名
// filename 图像的文件名
//
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.ReadBytes((int)br.BaseStream.Length);

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

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

// 函数: CreateData
// 创建数据集,包含一个表,表有两个字段:Country (string), 和 img (blob/byte[])
// 为表添加四条记录
//
DataSet CreateData()
{
DataSet data = new DataSet();

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

// 添加两个字段
data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));

// 创建数据集模式(该模式用于设计报表)
// 报表创建以后,不再需要模式文件
//data.WriteXmlSchema(Directory.GetCurrentDirectory() + "\\DynamicImage.xsd");

// 添加四行
AddImageRow(data.Tables[0], "USA", Directory.GetCurrentDirectory() + "\\USA.jpg");
AddImageRow(data.Tables[0], "Canada", Directory.GetCurrentDirectory() + "\\Canada.jpg");
AddImageRow(data.Tables[0], "Germany", Directory.GetCurrentDirectory() + "\\Germany.jpg");
AddImageRow(data.Tables[0], "Japan", Directory.GetCurrentDirectory() + "\\Japan.jpg");

return (data);
}

// 过程: CreateReport
// 创建报表,并传递数据集
//
void CreateReport()
{
// 创建报表
CrystalReport1 cr = new CrystalReport1();

// 将数据集(通过调用函数 CreateData 创建的)传递到子报表 "Flags"
cr.OpenSubreport("Flags").SetDataSource(CreateData());

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

public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();

//
// TODO: Add any constructor code after InitializeComponent call
//
CreateReport();
}

后面的部分省略……

时间: 2024-09-19 08:53:10

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

在水晶报表中 想 处理一个数据集 按列名 指定格式 显示在页眉某些地方

问题描述 在水晶报表中想处理一个数据集按列名指定格式显示在页眉某些地方如:中药费12诊查费11材料费14XX费310XX费48XX费522xx费613xx费711xx费811xx费912xx费1011xx费1111固定格式有则显示实际无则显示零即可现在我的数据集(发票明细)是中文名称金额(je)怎么将数据集处理成这种格式我现在是想建立12个公式每个公式这样写公式1:西药费WhilePrintingRecords;NumberVarje;NumberVari;NumberVarz;z:=0;for

[SOS]如何在水晶报表中显示Word文档中的内容

问题描述 当知道Word文档的地址时,如何根据地址,在水晶报表中显示该文档中的内容:或如何利用水晶报表显示SQLServer数据库中存储的图片类型数据 解决方案 解决方案二:有人说这个答案,试试http://www.cnblogs.com/babyt/archive/2005/04/21/142789.html

水晶报表中的导出和打印功能(寻高手帮忙!!!)

问题描述 水晶报表中的导出和打印功能不需要写代码,vs2005中自带这种功能.我有一次在别人机子上点击这两个按钮,都可以带到预期效果.但是在自己机器上点这两个按钮都没反应.这是怎么回事?本来以为是不是装上打印机才能用,但是别人机器也没装啊,好像也不用配置什么吧?

vs2008如何让水晶报表中的图片隐藏

问题描述 vs2008如何让水晶报表中的图片隐藏 有两张图片,根据报表中的某字段隐藏其中一张图片,如报表中性别字段为"男"时,隐藏其中一张,显示一 张,为"女"时,显示一 张,隐藏一张,比较急,请各位帮帮忙,感激不尽啊

请教一下水晶报表的高手,在程序中生成的DATASET(字段不确定),要怎么来使用水晶报表

问题描述 请教一下水晶报表的高手,在程序中生成的DATASET(字段不确定),要怎么来使用水晶报表 解决方案 解决方案二:对水晶报表不熟悉,帮顶一下,关注学习解决方案三:我只会将单表查询的结果用报表显示出来,怎样将多表查询的结果显示出来,关注,期待:......解决方案四:关注ing..帮顶!!

crystalreports-Crystal Reports水晶报表中图的图例如何修改啊?

问题描述 Crystal Reports水晶报表中图的图例如何修改啊? 在Crystal Reports水晶报表中,比如条形图中会有图例显示,但是图例中的文字都是你查询表格名.字段名+'和',如何把它修改成自己想要的内容呢?求好心人并且懂的人告知下,谢谢! 解决方案 crystal应该和Jasper一样的把,像我之前在做的报表项目,是从crystal转到Jasper的,但也需要修改图表的图例,我是通过加自定义类去实现的,用java代码实现自己想要添加的图例,最后打成jar包,加入到模板对应的图表

datagridview里面查找出的数据集放到水晶报表里面打印 2

问题描述 datagridview里面查找出的数据集放到水晶报表里面打印 2 请各位大神说说思路和步骤.Form1里面的datagridview数据集放到水晶报表里面打印.谢谢. 解决方案 http://bbs.csdn.net/topics/340210510

水晶报表中自定义导出方式

问题描述 水晶报表中自定义导出方式 我想重写一下导出方式,就是让excle等常用的项放前面,删掉不怎么用的项

c#- datagridview里面查找出的数据集放到水晶报表里面打印

问题描述 datagridview里面查找出的数据集放到水晶报表里面打印 困扰3天了,网上搜遍了.请热心人帮忙: 1.Form1 里面查询出结果在datagridview1里面显示出来. 2.建立了一个水晶报表cryrp1,里面配置好数据库连接,模板也已经设置好. 3.新建一个Form2,拖入一个CrystalReportViewer1,预览打印用. 4.Form 1 的打印按钮按下后弹出Form2,预览打印datagridview1的数据. 请问如果要实现第4步,应该怎么做?希望能有详细的解答