資料庫中儲存的圖片資料為byte型態的陣列資料,要如何加入rdlc檔中做出報表。
加入DataSet
在此使用DataSet代替資料庫,作為報表的資料來源。
加入DataSet的檔案,取名為「ds.xsd」。
編輯ds.xsd檔
資料表重新命名為「MainTable」,右鍵加入2個資料行,
資料行1命名為「ID」作為編號,
資料行2命名為「Img」存放圖檔。
加入rdlc檔
rdlc檔命名為「Report1.rdlc」。
在rdlc檔畫面下,點選「檢視」內的「ReportData」開啟「報表資料」。
在「報表資料」中的「資料集」,右鍵點選「加入資料集」。
名稱改為「MainTable」,資料來源選「ds」,資料集選「MainTable」。
在「Report1.rdlc」中,
右鍵加入「清單」,清單是可以連續列出多筆資料的容器。
右鍵加入「文字方塊」,預計用來顯示編號。
右鍵加入「影像」,預計用來顯示圖片。
再將「文字方塊」和「影像」放入「清單」內。
設定「文字方塊」
右鍵「文字方塊」選擇「運算式...」。
於「類別目錄」中選擇「欄位」。
「值」:雙擊選擇「ID」欄位,用於顯示編號資料。
設定「影像」
右鍵「影像」選擇「影像屬性...」。
於「一般」項目:
「選取影像來源」:選擇「資料庫」。
「使用此欄位」:進入運算式,雙擊選擇「Img」欄位。
「使用此MIME類型」:選擇「image/jpeg」(考慮原圖檔為jpg檔)。
於「大小」項目:
選擇「依比例調整」。
加入ReportViewer元件
從工具列拖拉,在form1視窗中放入「ReportViewer」,
用來顯示rdlc檔所設計的報表。
準備測試資料
撰寫函式取得測試資料表,模擬從資料庫取得的資料表,如下:
//製作2筆測試資料,傳回DataTable。
private DataTable GetDataTable()
{
DataTable dt = new DataTable();
dt.Columns.Add("ID", typeof(int)); //ID欄位設定為int型態。
dt.Columns.Add("Img", typeof(byte[])); //Img欄位必須為byte[]型態。
DataRow newrow = dt.NewRow();
newrow["ID"] = 1;
newrow["Img"] = GetPhotoToBytes("p1.jpg"); //p1.jpg放在debug資料夾內。
dt.Rows.Add(newrow);
newrow = dt.NewRow();
newrow["ID"] = 2;
newrow["Img"] = GetPhotoToBytes("p2.jpg"); //p2.jpg放在debug資料夾內。
dt.Rows.Add(newrow);
return dt;
}
//將圖檔轉成byte陣列。
private byte[] GetPhotoToBytes(string photoPath)
{
byte[] bytes;
using (Bitmap bmp = new Bitmap(photoPath))
using (MemoryStream ms = new MemoryStream())
{
bmp.Save(ms, ImageFormat.Png);
bytes = new byte[(int)ms.Length];
ms.Position = 0;
ms.Read(bytes, 0, (int)ms.Length);
ms.Flush();
}
return bytes;
}
設定ReportViewer
在Load事件下,撰寫程式來初始化和設定ReportViewer。
private void Form1_Load(object sender, EventArgs e)
{
reportViewer1.LocalReport.ReportPath = "Report1.rdlc"; //使用相對路徑
ReportDataSource rds = new ReportDataSource("MainTable", GetDataTable());
reportViewer1.LocalReport.DataSources.Add(rds);
reportViewer1.RefreshReport();
}
完成