首页 > 编程 > .NET > 正文

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

2024-07-10 13:03:42
字体:
来源:转载
供稿:网友

目录

描述
文件列表
步骤
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();
}

后面的部分省略……

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表