標籤:c# image 圖片展示 truedbgrid
表格中載入圖片是很常見的功能,尤其是網頁中,圖片的展示更是隨處可見。這個功能在bs中很容易就實現了:
前台代碼:
<asp:GridView ID="GridView1" runat="server"> <Columns> <asp:TemplateField> <ItemTemplate> <asp:Image ID="img1" ImageUrl='<%#Eval("img") %>' runat="server" AlternateText="image lost" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
然後綁定上資料來源就可以了。
但是在CS項目中實現起來並不是那麼簡單。現在來說明下用C1TrueDBGrid控制項怎麼實現圖片的綁定與展示。
首先需要說明一點:C1TrueDBGrid控制項不能直接綁定包含圖片的資料來源,因為圖片是以OracleType.Blob類型儲存在資料庫中的,直接把查詢到資料來源綁定到控制項上會報錯。
具體的實現過程:
1 . 從資料庫查詢出兩個資料來源,一個包含圖片,一個包含圖片外的資訊。
DataTable detailTbl = new DataTable();
DataTable TablePic = new DataTable();
(具體查詢過程不再描述了)
2 . 將不包含圖片的資料來源綁定到控制項上。
//綁定資料來源
DGVpic.DataSource = detailTbl;
3 . 動態添加一列,並設定其屬性。
// 動態添加圖片列 C1.Win.C1TrueDBGrid.C1DataColumn Col = new C1.Win.C1TrueDBGrid.C1DataColumn(); DGVpic.Columns.Insert(0, Col); Col.Caption = "Image"; //列名稱 Col.DataType = Type.GetType("Byte"); //資料類型 Col.DataField = "b_pic_big"; //綁定欄位名稱 //設定圖片列的屬性 C1.Win.C1TrueDBGrid.C1DisplayColumn dc; dc = DGVpic.Splits[0].DisplayColumns["b_pic_big"]; DGVpic.Splits[0].DisplayColumns.RemoveAt(DGVpic.Splits[0].DisplayColumns.IndexOf(dc)); DGVpic.Splits[0].DisplayColumns.Insert(0, dc); dc.Visible = true; dc.FetchStyle = true; //FetchStyle = true 這點很重要!
4 . 利用DGVpic_FetchCellStyle事件,將包含圖片的資料來源填充到C1TrueDBGrid控制項上。在這裡涉及到兩次轉換,一是將Oracle Blob類型的資料強制轉換成byte[]類型,然後調用函數將byte[]轉換成Image類型,最後顯示出來。
private void DGVpic_FetchCellStyle(object sender, C1.Win.C1TrueDBGrid.FetchCellStyleEventArgs e) { //在兩個資料來源中尋找出匹配項 DataRow[] dataRows = TablePic.Select("s_toolsid='" + detailTbl.Rows[e.Row]["s_toolsid"] + "'"); if (dataRows.Length != 0) { //將Oracle Blob類型的資料強制轉換成byte[]類型,然後調用GetImageFromByteArray函數將byte[]轉換成Image類型。 e.CellStyle.ForegroundImage = GetImageFromByteArray((byte[])dataRows[0]["b_pic_big"]); e.CellStyle.ForeGroundPicturePosition = C1.Win.C1TrueDBGrid.ForeGroundPicturePositionEnum.PictureOnly; } }
GetImageFromByteArray方法:
/// <summary> /// 將byte[]類型轉換為Image類型,並返回 /// </summary> /// <param name="picData"></param> /// <returns></returns> private Image GetImageFromByteArray(byte[] picData) { if (picData == null) return null; int bmData = (picData[0] == 0x15 && picData[1] == 0x1c) ? 78 : 0; Image img = null; try { //進行轉換 System.IO.MemoryStream ms = new System.IO.MemoryStream(picData, bmData, picData.Length - bmData); img = Image.FromStream(ms); } catch { } // 返回得到的Image類型資料 return img; }
做完這幾步,圖片就可以載入出來了。
綜上所述,有幾點應該特別注意:
1 . 上面也說了,C1TrueDBGrid控制項不能直接綁定包含圖片的資料來源,因為圖片是以OracleType.Blob類型儲存在資料庫中的,直接把查詢到資料來源綁定到控制項上會報錯。
1 . 綁定圖片列前,先給控制項綁定上資料來源,否則圖片列將不會顯示。原因是使用FetchCellStyle事件,該Cell要有值才能觸發該事件。
2 . 要將FetchStyle屬性設定為True
C# C1TrueDBGrid控制項如何載入圖片列