您的位置:首页 > 其它

水晶报表中如何动态加载图片

2009-05-27 14:05 471 查看
本文的方法是:水晶报表中如何动态加载图片(图片文件版本及数据库版本) 中的图片文件版本。
本文适用于VS2003及VS2005自带版本的水晶报表,当然同样适用于CR XI及以上版本,就是烦了点。
本文使用VS2005及自带版本的水晶报表。

在这里,我把命题重新提炼一下:
已经有一个完整的报表,现在报表需要加载一个本地磁盘图片做为logo。报表中的logo随着本地图片的变化自动变化。
一般我们通过插入一个pictureobject来插入磁盘图片,但是插入后,图片就成为报表的一份,达不到变化的目的。

1:首先我们已经有了一个单表的完整水晶报表应用







2:为了能挂接我们的本地图片,在dataset里新建立一个表mylogo。
里面放上两个字段,字段类型为System.Byte[]或System.sByte[]
注意,默认类型里只有System.Byte和System.SByte,要自己输入的。

这个mylogo就是一个中介,我们把本地图片读到这个表里,水晶报表从这个表里读到图片显示。



3:在现有报表里加入一个子报表,数据源就是这个mylogo.



把两个字段拖到子报表上。



4:代码段是这样的

1 //设置数据源信息
2 DataSet1 ds1 = new DataSet1();
3 OleDbDataAdapter da = new OleDbDataAdapter();
4 String connstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath ("~/app_data/test.mdb")+";";
5 OleDbConnection cn = new OleDbConnection(connstr);
6
7
8 //获取记录集,注意,最终获取的记录集需要与xsd的结构一致!
9 da = new OleDbDataAdapter("SELECT EmployeeId1 as EmployeeId,EmployeeName1 as EmployeeName From Employee1", cn);
10 da.Fill(ds1, "Employee");
11
12 //把本地图片先写入到数据集
13
14 //将图片读到stream,并转换为byte[]
15 //图片1
16 FileStream fs1 = new FileStream(@"c:/1.bmp", FileMode.Open, FileAccess.Read);
17 BinaryReader br1 = new BinaryReader(fs1);
18 byte[] bt1 = br1.ReadBytes((int)fs1.Length);
19 //图片2
20 FileStream fs2 = new FileStream(@"c:/a2.jpg", FileMode.Open, FileAccess.Read);
21 BinaryReader br2 = new BinaryReader(fs2);
22 byte[] bt2 = br2.ReadBytes((int)fs2.Length);
23
24 fs1.Close();
25 fs2.Close();
26 //写入到ds1中(仅1行)
27 ds1.myLogo.AddmyLogoRow(bt1, bt2);
28
29
30 //以上为数据部分,与报表无关
31 //-----------------------------------------------------------
32 //以下为报表部分
33
34 //使用报表对象加载报表
35
36 string reportPath = Server.MapPath("~/app_data/crystalreport1.rpt");
37 myReport.Load(reportPath);
38 //绑定数据集,注意,一个报表用一个数据集。
39 myReport.SetDataSource(ds1);
40 CrystalReportViewer1.ReportSource = myReport;

5:效果是这样的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: