2011年12月3日 星期六

水晶报表中显示动态图片

引用來源
---
环境:
VS 2003.net, C#, Web, Crystal Report 10

主要思路:
将图片以二进制流放入 DataTable 中,传入报表中显示。

例子:
1. 建立xml表结构定义:XSDSchema1.xsd
元素(Element):Element1
字段名
数据类型
Image
hexBinary
2. 建立报表 CrystalReport1.rpt
3. 为报表加入数据库连接
选择 Create New Connection / ADO.NET (XML), 选择步骤1建立的文件XSDSchema1.xsd
4. 将 字段 Image 拖入报表中 (是一个IBlobFieldObject对象)
5. 创建 WebForm1.aspx,用于显示报表
6. 将 CrystalReportViewer 拖入 WebForm1.aspx,
7. 在 WebForm1.cs 部分代码如下:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.IO;

//获取图片的二进制内容
System.Drawing.Image img;
System.IO.MemoryStream mm = new MemoryStream();
//img 读取图片
...
//将 Image 对象内容转入 MemoryStream 中
img.Save(mm, System.Drawing.Imaging.ImageFormat.Bmp);
//将 MemoryStream 内容转换为 byte[],放入 DataTable 中
DataSet ds = new DataSet();
DataTable dt = new DataTable("Element1"); //与定义元素(Element)同名
dt.Columns.Add("Image", typeof(System.Byte[]) ); //二进制格式
DataRow dr = dt.NewRow();
dr["Image"] = mm.ToArray();  //将 MemoryStream 转换为 byte[]
//将报表文件载入 ReportDocument中
ReportDocument m_Rep = new ReportDocument();
m_Rep.Load(Server.MapPath("CrystalReport1.rpt"));
//获取报表中显示图片的对象(图片对象不会随着图片大小自动条件,需要代码控制)
BlobFieldObject imageObject = (BlobFieldObject) m_Rep.ReportDefinition.ReportObjects["Image1"] as BlobFieldObject;
imageObject.Width = img.Width * 15;  //报表中的长宽单位是缇,1像素=15缇
imageObject.Height = img.Height * 15;
//将 ReportDocument 对象传入 CrystalReportView 中,显示
CrystalReportViewer1.ReportSource = m_Rep;
CrystalReportViewer1.DataBind();

沒有留言:

張貼留言