C# C1TrueDBGrid控件如何加载图片列
2014-11-07 22:08
288 查看
表格中加载图片是很常见的功能,尤其是网页中,图片的展示更是随处可见。这个功能在bs中很容易就实现了:
前台代码:
然后绑定上数据源就可以了。
但是在CS项目中实现起来并不是那么简单。现在来说明下用C1TrueDBGrid控件怎么实现图片的绑定与展示。
首先需要说明一点:C1TrueDBGrid控件不能直接绑定包含图片的数据源,因为图片是以OracleType.Blob类型保存在数据库中的,直接把查询到数据源绑定到控件上会报错。
具体的实现过程:
1 . 从数据库查询出两个数据源,一个包含图片,一个包含图片外的信息。
DataTable detailTbl = new DataTable();
DataTable TablePic = new DataTable();
(具体查询过程不再描述了)
2 . 将不包含图片的数据源绑定到控件上。
//绑定数据源
DGVpic.DataSource = detailTbl;
3 . 动态添加一列,并设置其属性。
4 . 利用DGVpic_FetchCellStyle事件,将包含图片的数据源填充到C1TrueDBGrid控件上。在这里涉及到两次转换,一是将Oracle Blob类型的数据强制转换成byte[]类型,然后调用函数将byte[]转换成Image类型,最后显示出来。
GetImageFromByteArray方法:
做完这几步,图片就可以加载出来了。
综上所述,有几点应该特别注意:
1 . 上面也说了,C1TrueDBGrid控件不能直接绑定包含图片的数据源,因为图片是以OracleType.Blob类型保存在数据库中的,直接把查询到数据源绑定到控件上会报错。
1 . 绑定图片列前,先给控件绑定上数据源,否则图片列将不会显示。原因是使用FetchCellStyle事件,该Cell要有值才能触发该事件。
2 . 要将FetchStyle属性设置为True
前台代码:
<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
相关文章推荐
- 如何动态加载multiline的text控件
- 如何动态加载控件以及插件编程思想(C#)
- 如何动态加载控件以及插件编程思想(C#)
- 如何动态加载控件以及插件编程思想
- Visual Basic 2005——如何在DataGridView控件的储存格中同时显示出文字与图片
- 如何动态加载控件以及插件编程思想(C#)
- 如何动态加载控件以及插件编程思想(C#)
- 如何动态加载控件以及插件编程思想(C#)
- 如何设置C# treeview Web控件背景图片
- 请问如何让Dundas chart for asp.net控件产生的临时图片文件减少一些?
- 如何动态加载控件以及插件编程思想(C#)
- 如何确定WebBrowser 控件中的页面加载完成
- 水晶报表中如何动态加载图片(图片文件版本及数据库版本)
- 服务器控件如何自动加载回发数据
- Visual Basic 2005——如何在DataGridView控件的储存格中同时显示出文字与图片
- 如何使用asp.net中的控件将一个图片文件从一个目录传到另外一个目录下?
- 第三方控件如何加载以及调用?
- 如何在数据中能加载.JPG格式的图片
- 用户控件动态加载图片问题解决方法!
- 如何动态加载控件以及插件编程思想