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

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

 

 

 

 

作为ComponentOne Studio for .NET 和 ComponentOne Studio Enterprise的一部分,ComponentOne True DBGrid for .NET是我们受欢迎的ActiveX控件-True DBGrid Pro的.NET版本。它使用ADO.NET,最新的数据绑定技术,能完全管理数据库界面并提供强大灵活的浏览,编辑,添加和操作表格数据的能力。 True DBGrid Pro for ActiveX的爱好者会喜欢ComponentOne True DBGrid for .NET。因为它包含了您所依赖的特性:复合显示模式,具有独立或同步滚动的水平和垂直拆分,完全可定制网格界面(字体,颜色,图片和格式),增强键盘导航,健壮的打印选项以及其它更多特性! [特 性] ComponentOne True DBGrid for .NET具有您对我们畅销的ActiveX 控件True DBGrid Pro所期望的高级特性。以下是一个实例: 复合显示模式以最实用的格式表示数据:标准Outlook样式分组,可以动态的排序网格;分层数据显示提供了增强的Master-Detail显示以及完全可编辑的下拉视图;窗体视图可在需要能修改的标准“窗体”中重新定位数据;反转视图可将行转换为,从而提供方便的“向下读”方式。 Microsoft Word- 和Excel-类型模型定制网格的外观:字体,颜色,图片以及格式化规范。从和行边框…到前景图片…到正文环绕。能非常简单的让网格显示出您需要的结果。 具有定制滚动条的垂直和水平分割可以水平,垂直和两者同时分割网格!此外,您具有对滚动行为的控制:选择具有在每个分割中独立工作的滚动条(对于需要从不同的数据中对比字段值时非常有效)或选择一个滚动条同步滚动复合分割。 2D和3D单元显示选择两维,三维和两者结合来控制单元外观符合您的要求。例如,您可能希望允许鼠标移动元素来获得一个3D外观。 Excel-类型单元格选项选择不但可以是任何行或,而且可以是任何区域的单元。 丰富的滚动能力跟踪滚动条的位置并且在滚动条移动时给用户一个信息弹出框。 自动调整尺寸(弹性模式)当网格水平尺寸调整时,通过适当改变的尺寸保证您的数据可见。 增强键盘导航当用户按回车键时使用DirectionAfterEnter属性控制下一单元的相应位置。 FilterBar数据输入行实现定制用户操作,如增长搜索和记录集过滤。 标签属性可以向一个附加任何类型的对象。 合并相邻单元从指定的中合并相邻数据行到一个不可编辑单元,或独立显示所有单元属性。 AutoDropdown和 AutoCompletion属性 · 通过减少下拉选项所需按键次数来简化数据输入。 · 自动将网格单元转换为True DBDropDown值 · 连接一个TDBDropDown控件到一个包含值和描述的表上,该表的下拉选项将自动的将描述映射到该值上。 · 健壮的打印选项 · 控件打印具有完备的功能,如缩放,调整到窗体,停止分页以及打印预览。
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值