水晶报表中如何动态加载图片(图片文件版本及数据库版本)

o_Babyt_CopyRight1.gif 

开发环境: VS2003(VB.Net) + 水晶报表10高级专业开发版 + Win2003

Step1:数据库文件版本

如果你在数据库中采用了二进制字段存储图片文件
微软 Access 里这些字段叫作 OLE 字段,而Oracle和SQL Server把它们称作 BLOB (二进制大型对象) 字段
那么在报表上显示出来就非常之简单
因为之前我没有做过类似的显示图片文件的报表,等我做出来之后,我自己都乐了
其实对这种二进制形式来说,跟普通的字段是一样的,拖到模板上就行了,呵呵
o_CR042105_1_1.jpg

o_CR042105_1_2.jpg

Setp2:下面我们来做一下加载磁盘上的图片的程序

其实有了上次《在水晶报表中实现任意选择指定字段显示》的实践,这次的思路就很明了了
就是先创建一个跟数据库版本一致的报表,当然是使用人见人爱的Ado.Net的方式
自己构造一个DataSet,把本地图片读成二进制流写进去
然后将这个DataSet推给报表就行了

我使用了水晶报表自己带的示例数据库里面的"雇员表"
o_CR042105_1_3.jpg

看一下结构,主要是看一下各字段的格式,因为我们在创建DataSet的时候进行对应
o_CR042105_1_4.jpg
特别注意下那个图片字段的格式,在VB.Net里我们可以用Byte来与之呼应

模板文件如下,没啥特别
o_CR042105_1_5.jpg

代码如下,有详尽注释。

  1 None.gif ' ************************************************************************* 
  2 None.gif' **模 块 名:CR_DynLoadPics
  3 None.gif' **说 明:Facesun.cn 版权所有2005 - 2006(C) 
  4 None.gif' **创 建 人:Babyt(阿泰) http://www.cnblogs.com/babyt 
  5 None.gif' **日 期:2005-04-21 
  6 None.gif' **修 改 人: 
  7 None.gif' **日 期: 
  8 None.gif' **描 述:从本地磁盘获取图片文件进行显示
  9 None.gif'           本程序为原型程序,未进行完整保护
 10 None.gif' **版 本:V1.0.0 
 11 None.gif' ************************************************************************* 
 12 None.gif
 13 None.gif Imports  System.Data
 14 None.gif ' 注意此处IO的加入是为了读取图片文件
 15 None.gif Imports  System.IO
 16 ExpandedBlockStart.gifContractedBlock.gif Public   Class Form1 Class Form1
 17InBlock.gif    Inherits System.Windows.Forms.Form
 18InBlock.gif
 19ExpandedSubBlockStart.gifContractedSubBlock.gifWindows 窗体设计器生成的代码#Region " Windows 窗体设计器生成的代码 "
 20InBlock.gif
 21ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Sub New()Sub New()
 22InBlock.gif        MyBase.New()
 23InBlock.gif
 24InBlock.gif        '该调用是 Windows 窗体设计器所必需的。
 25InBlock.gif        InitializeComponent()
 26InBlock.gif
 27InBlock.gif        '在 InitializeComponent() 调用之后添加任何初始化
 28InBlock.gif
 29ExpandedSubBlockEnd.gif    End Sub

 30InBlock.gif
 31InBlock.gif    '窗体重写 dispose 以清理组件列表。
 32ExpandedSubBlockStart.gifContractedSubBlock.gif    Protected Overloads Overrides Sub Dispose()Sub Dispose(ByVal disposing As Boolean)
 33InBlock.gif        If disposing Then
 34InBlock.gif            If Not (components Is NothingThen
 35InBlock.gif                components.Dispose()
 36InBlock.gif            End If
 37InBlock.gif        End If
 38InBlock.gif        MyBase.Dispose(disposing)
 39ExpandedSubBlockEnd.gif    End Sub

 40InBlock.gif
 41InBlock.gif    'Windows 窗体设计器所必需的
 42InBlock.gif    Private components As System.ComponentModel.IContainer
 43InBlock.gif
 44InBlock.gif    '注意: 以下过程是 Windows 窗体设计器所必需的
 45InBlock.gif    '可以使用 Windows 窗体设计器修改此过程。
 46InBlock.gif    '不要使用代码编辑器修改它。
 47InBlock.gif    Friend WithEvents Button1 As System.Windows.Forms.Button
 48InBlock.gif    Friend WithEvents TextBox1 As System.Windows.Forms.TextBox
 49InBlock.gif    Friend WithEvents CrystalReportViewer1 As CrystalDecisions.Windows.Forms.CrystalReportViewer
 50InBlock.gif    Friend WithEvents Label1 As System.Windows.Forms.Label
 51ExpandedSubBlockStart.gifContractedSubBlock.gif    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()Sub InitializeComponent()
 52InBlock.gif        Me.Button1 = New System.Windows.Forms.Button
 53InBlock.gif        Me.TextBox1 = New System.Windows.Forms.TextBox
 54InBlock.gif        Me.CrystalReportViewer1 = New CrystalDecisions.Windows.Forms.CrystalReportViewer
 55InBlock.gif        Me.Label1 = New System.Windows.Forms.Label
 56InBlock.gif        Me.SuspendLayout()
 57InBlock.gif        '
 58InBlock.gif        'Button1
 59InBlock.gif        '
 60InBlock.gif        Me.Button1.Location = New System.Drawing.Point(52040)
 61InBlock.gif        Me.Button1.Name = "Button1"
 62InBlock.gif        Me.Button1.TabIndex = 0
 63InBlock.gif        Me.Button1.Text = "生成报表"
 64InBlock.gif        '
 65InBlock.gif        'TextBox1
 66InBlock.gif        '
 67InBlock.gif        Me.TextBox1.Location = New System.Drawing.Point(4040)
 68InBlock.gif        Me.TextBox1.Name = "TextBox1"
 69InBlock.gif        Me.TextBox1.Size = New System.Drawing.Size(39221)
 70InBlock.gif        Me.TextBox1.TabIndex = 1
 71InBlock.gif        Me.TextBox1.Text = "E:\myNet\CR_DynLoadPics\Pics"
 72InBlock.gif        '
 73InBlock.gif        'CrystalReportViewer1
 74InBlock.gif        '
 75InBlock.gif        Me.CrystalReportViewer1.ActiveViewIndex = -1
 76InBlock.gif        Me.CrystalReportViewer1.AutoScroll = True
 77InBlock.gif        Me.CrystalReportViewer1.DisplayBackgroundEdge = False
 78InBlock.gif        Me.CrystalReportViewer1.DisplayGroupTree = False
 79InBlock.gif        Me.CrystalReportViewer1.Location = New System.Drawing.Point(2480)
 80InBlock.gif        Me.CrystalReportViewer1.Name = "CrystalReportViewer1"
 81InBlock.gif        Me.CrystalReportViewer1.ReportSource = Nothing
 82InBlock.gif        Me.CrystalReportViewer1.Size = New System.Drawing.Size(616320)
 83InBlock.gif        Me.CrystalReportViewer1.TabIndex = 2
 84InBlock.gif        '
 85InBlock.gif        'Label1
 86InBlock.gif        '
 87InBlock.gif        Me.Label1.Location = New System.Drawing.Point(408)
 88InBlock.gif        Me.Label1.Name = "Label1"
 89InBlock.gif        Me.Label1.Size = New System.Drawing.Size(43223)
 90InBlock.gif        Me.Label1.TabIndex = 3
 91InBlock.gif        Me.Label1.Text = "请正确输入图片文件所在的目录,最后面不要带\,此处未进行校验!"
 92InBlock.gif        '
 93InBlock.gif        'Form1
 94InBlock.gif        '
 95InBlock.gif        Me.AutoScaleBaseSize = New System.Drawing.Size(614)
 96InBlock.gif        Me.ClientSize = New System.Drawing.Size(664429)
 97InBlock.gif        Me.Controls.Add(Me.Label1)
 98InBlock.gif        Me.Controls.Add(Me.CrystalReportViewer1)
 99InBlock.gif        Me.Controls.Add(Me.TextBox1)
100InBlock.gif        Me.Controls.Add(Me.Button1)
101InBlock.gif        Me.Name = "Form1"
102InBlock.gif        Me.Text = "Form1"
103InBlock.gif        Me.ResumeLayout(False)
104InBlock.gif
105ExpandedSubBlockEnd.gif    End Sub

106InBlock.gif
107ExpandedSubBlockEnd.gif#End Region

108InBlock.gif
109ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub Button1_Click()Sub Button1_Click(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles Button1.Click
110InBlock.gif        '查看CrystalReport1的定义可以查看对应的报表类
111InBlock.gif        Dim crReportDocument As New CrystalReport1
112InBlock.gif        Dim myDataSet As New DataSet
113InBlock.gif        Dim PicPath As String
114InBlock.gif        Dim myColume As System.Data.DataColumn
115InBlock.gif        Dim myRow As DataRow
116InBlock.gif
117InBlock.gif        '--------------------------------------------------------------------- 
118InBlock.gif        '构造一个表,对应xsd文件
119InBlock.gif        myDataSet.Tables.Add("雇员")
120InBlock.gif        '构造表结构,可以只构造部分字段
121InBlock.gif        myDataSet.Tables(0).Columns.Add("", System.Type.GetType("System.String"))
122InBlock.gif        myDataSet.Tables(0).Columns.Add("", System.Type.GetType("System.String"))
123InBlock.gif        myDataSet.Tables(0).Columns.Add("雇员照片", System.Type.GetType("System.Byte[]"))
124InBlock.gif
125InBlock.gif        '--------------------------------------------------------------------- 
126InBlock.gif        '写入数据
127InBlock.gif        '注意此处没有进行校验
128InBlock.gif        PicPath = TextBox1.Text & "\"
129InBlock.gif        '写数据行(分别用了3种图片格式)
130InBlock.gif        '提示:
131InBlock.gif        '   在这里你就可以使用你的数据库中保存的文件路径了
132InBlock.gif        '   用你的DataSet来填充这个将推给报表的DataSet
133InBlock.gif        '   如:
134InBlock.gif        AddOneRow(myDataSet.Tables(0), "Babyt""JPG文件", PicPath & "BBT_042105_04.jpg")
135InBlock.gif        AddOneRow(myDataSet.Tables(0), "FaceSun""Gif文件", PicPath & "Image49.gif")
136InBlock.gif        AddOneRow(myDataSet.Tables(0), """Gif文件", PicPath & "Image5.gif")
137InBlock.gif        AddOneRow(myDataSet.Tables(0), """JPG文件", PicPath & "1.jpg")
138InBlock.gif        AddOneRow(myDataSet.Tables(0), "燕子""JPG文件", PicPath & "2.jpg")
139InBlock.gif        AddOneRow(myDataSet.Tables(0), "Cnblogs.com/babyt""BMP文件", PicPath & "Coup30.bmp")
140InBlock.gif
141InBlock.gif        '将这个DataSet推给报表
142InBlock.gif        crReportDocument.SetDataSource(myDataSet)
143InBlock.gif
144InBlock.gif        ''将报表传递给浏览器
145InBlock.gif        CrystalReportViewer1.ReportSource = crReportDocument
146ExpandedSubBlockEnd.gif    End Sub

147InBlock.gif    '*************************************************************************
148InBlock.gif    '**函 数 名:AddOneRow
149InBlock.gif    '**输    入:
150InBlock.gif    '        ByRef tbl As DataTable 要操作的表,注意是Byref
151InBlock.gif    '        ByVal c1 As String  第一个字段的值
152InBlock.gif    '        ByVal c1 As String  第二个字段的值
153InBlock.gif    '        ByVal c1 As String  第三个字段的值,注意传入的是完整的图片文件名
154InBlock.gif    '**输    出:无
155InBlock.gif    '**功能描述: 在DataTable中增加一个数据行
156InBlock.gif    '               该过程的主要是封装根据文件名提取本地文件写入到DataSet中
157InBlock.gif    '**全局变量:
158InBlock.gif    '**调用模块:
159InBlock.gif    '**作    者:Babyt(阿泰) 
160InBlock.gif    '**日    期:2005-04-21
161InBlock.gif    '**修 改 人:
162InBlock.gif    '**日    期:
163InBlock.gif    '**版    本:V2.0.0
164InBlock.gif    '*************************************************************************
165ExpandedSubBlockStart.gifContractedSubBlock.gif    Public Sub AddOneRow()Sub AddOneRow(ByRef tbl As DataTable, ByVal c1 As StringByVal c2 As StringByVal c3 As String)
166InBlock.gif        Dim fs As New FileStream(c3, FileMode.Open)   ' 获取文本流
167InBlock.gif        Dim br As New BinaryReader(fs)                ' 创建Binary Reader
168InBlock.gif        Dim row As DataRow
169InBlock.gif
170InBlock.gif        '创建一个新行
171InBlock.gif        row = tbl.NewRow()
172InBlock.gif
173InBlock.gif        '赋值
174InBlock.gif        row(0= c1
175InBlock.gif        row(1= c2
176InBlock.gif        '注意此处的写入方式
177InBlock.gif        row(2= br.ReadBytes(br.BaseStream.Length)
178InBlock.gif
179InBlock.gif        '将该行增加到目标表
180InBlock.gif        tbl.Rows.Add(row)
181InBlock.gif
182InBlock.gif        ' 释放
183InBlock.gif        br = Nothing
184InBlock.gif        fs = Nothing
185ExpandedSubBlockEnd.gif    End Sub

186InBlock.gif
187ExpandedSubBlockStart.gifContractedSubBlock.gif    Private Sub Form1_Load()Sub Form1_Load(ByVal sender As System.ObjectByVal e As System.EventArgs) Handles MyBase.Load
188InBlock.gif        TextBox1.Text = Directory.GetCurrentDirectory() & "\Pics"
189ExpandedSubBlockEnd.gif    End Sub

190ExpandedBlockEnd.gifEnd Class

191 None.gif



运行效果
o_CR042105_1_6.jpg

后记1:
我参考了海波的《利用数据集在水晶报表中显示图像的 .NET 程序教程 》
http://blog.csdn.net/haibodotnet/archive/2004/04/12/21570.aspx
里面是用子报表实现的,比较巧妙
大家可以参考一下,其中也有个VB.Net的例子
http://ftp1.businessobjects.com/outgoing/products/Devzone/vbnet_win_DynamicImage.zip

后记2:
经过实验,这个方法只能正常显示BMP/JPG图片,Gif就显示不出来
而且其大小似乎是固定的,不能随着图片的大小自动变化
所以这就要求你的图片尺寸一致

本文中的完整代码请在此处下载
http://files.cnblogs.com/babyt/CR_DynLoadPics.rar


-------Over------------------
希望这篇文章对你有所帮助。
阿泰 200504201

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值