2010年7月19日 星期一

為你的水晶報表裝載本地圖片

為你的水晶報表裝載本地圖片【轉】
本文為解答該貼所做:http://topic.csdn.net/u/20090524/15/911fd15a-32c6-4be9-9aa1-3ee95365e7e3.html
並沒有什麼新內容,主要是如何讀取本地圖片顯示在報表中。
如果是CR XI及以上版本,可以用更簡便的方法,參考:水晶報表圖片動態加載的另一種簡單方案
本文的方法是:水晶報表中如何動態加載圖片(圖片文件版本及數據庫版本) 中的圖片文件版本。
本文適用於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:效果是這樣的

沒有留言:

張貼留言