目录
描述 文件列表 步骤 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(); } 后面的部分省略……
|