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

原创 2004年04月12日 12:42:00

目录

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


VB.NET 版

http://ftp1.businessobjects.com/outgoing/products/Devzone/vbnet_win_DynamicImage.zip

【水晶报表之图片篇-c】 CR 11版本动态加载的另一种简单方案

2005年我在《水晶报表中如何动态加载图片(图片文件版本及数据库版本)》 提供的方法中,用了编程的方法,虽然也实现了,但是比较繁琐 地址: http://www.cnblogs.com/baby...
  • findsafety
  • findsafety
  • 2015年03月24日 16:09
  • 2852

如何在水晶报表里显示图象?

通常我们要在水晶报表里显示文本和数字数据。有时候,数据库里会包含图象数据,并且我们也希望在水晶报表里使用它。有很多途径可以在报表中显示数据驱动的图象第一要确保图象具有足够的大小和质量。设法在报表里将高...
  • haibodotnet
  • haibodotnet
  • 2004年01月08日 11:39
  • 3654

VB6调用水晶报表9.2实例

  • 2015年01月19日 02:41
  • 11KB
  • 下载

在VB中使用水晶报表的一种简易编程方法

    var newasp_fontsize=9;var newa...
  • rainbowsoftware
  • rainbowsoftware
  • 2007年07月10日 15:23
  • 463

水晶报表VB中链如OLE对象如图片等,并对其进行属性操作

创建一个新的报表实例Dim oReport As New CrystalReport1 Private Sub Form_Load() 声明一个新的OLE对象Dim oOleObject As cr...
  • phlexii
  • phlexii
  • 2006年04月10日 08:50
  • 2240

水晶报表使用经验总结

转自    http://blog.csdn.net/louisp/archive/2005/10/27/517621.aspx   资料:Asp.Net中使用水晶报表(上)www.dotnet8.c...
  • add8849
  • add8849
  • 2005年11月28日 09:13
  • 14498

水晶报表实现选择任意字段打印(VB)

在网上找了很多水晶报表选择字段打印的方法,都没有得到想要的结果!虽说可以调用水晶报表的Report Wizard 功能强大,但客户用起来感觉头晕,没办法,只好自己动手了~~~~选择要打印的字段~~~设...
  • fage407
  • fage407
  • 2006年10月24日 11:57
  • 2111

如何使用代码动态设置水晶报表中的文本,字段等对象呢?

如何使用代码动态设置水晶报表中的文本,字段等对象呢? //VB 首先,你必须要声明一个OBJECT变量(eg. TextObject, FieldObject, ......),当然不是一般的对象,而...
  • findsafety
  • findsafety
  • 2014年11月11日 15:10
  • 3941

VB程序打印水晶报表的典型方法1

  • zgqtxwd
  • zgqtxwd
  • 2008年04月27日 17:12
  • 132

[水晶报表]水晶报表的使用经验和资料总结

水晶报表的使用经验和资料总结资料: Asp.Net中使用水晶报表(上) www.dotnet8.com 2002-9-6 DotNet吧[HTML]在我们对VS.Net中的水晶报表(Cryst...
  • david_520042
  • david_520042
  • 2016年08月17日 09:30
  • 2707
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用数据集在水晶报表中显示图像的 .NET 程序教程
举报原因:
原因补充:

(最多只允许输入30个字)