C# C1TrueDBGrid控件如何加载图片列

来源:互联网 发布:创建淘宝店铺 编辑:程序博客网 时间:2024/06/04 23:24

表格中加载图片是很常见的功能,尤其是网页中,图片的展示更是随处可见。这个功能在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

 

 

 

 

3 0
原创粉丝点击