.net中关于PictureBox绑定数据库的图片字段

这篇博客讲述了在.NET环境中,如何处理数据库中的BLOB字段,特别是图片数据,以便将其绑定到PictureBox控件上。内容涉及到处理从SQL Server表中读取的字节数组,包括使用MemoryStream和Bitmap对象进行转换,以及处理数据库中可能存在的额外前缀字节。通过Format事件处理程序,实现了从Byte[]到Image的有效转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

绑定到 BLOB 字段

Windows 窗体数据绑定很适用于 BLOB 字段(即图像),但并非以默认方式来实现。如果您尝试将 Employees.Photo 列绑定到PictureBoxImage 属性,会引发一个异常。

Dim b5 As Binding
b5 = New Binding("Image", m_ds, "Employees.Photo")
hired.DataBindings.Add(b5)

产生该异常的原因是所需的类型 (System.Drawing.Image) 和解析为 System.Byte[]Photo 字段的内容之间明显不兼容。使情况更为复杂的是,Northwind 的 Employees 图片还需要进行某种处理才能真正使用。

所有这些问题最后归结为,您需要的不仅仅是到成功绑定到图像的简单转换。尽管如此,您还是可以利用 Format 事件轻松完成任务。

如果您使用 C#,就不必声明全局数据成员来捕获事件。因此,您的代码可以显示如下:

Binding b5;
b5 = new Binding("Image", m_ds, "Employees.Photo");
b5.Format += new ConvertEventHandler(this.PictureFormat);
Photo.DataBindings.Add(b5);

事件处理程序将字节数组转换为 Bitmap 对象,该对象可以安全地分配给 PictureBox 控件的 Image 属性。

void PictureFormat(Object sender, ConvertEventArgs e)
{
   // e.Value is the original value
   Byte[] img = (Byte[]) e.Value;

   // Perform the conversion 
// (78 is the offset to skip ONLY FOR images in NorthWind)
   MemoryStream ms = new MemoryStream();
   int offset = 78;      // should be 0    
   ms.Write(img, offset, img.Length - offset);
   Bitmap bmp = new Bitmap(ms);
   ms.Close();

   // Writes the new value back
   e.Value = bmp;
}

从 SQL Server™ 表读取的字节数组首先复制到 MemoryStream 对象。此步骤是必不可少的,因为,在 .NET 中,您不能直接从字节数组创建图形对象。取而代之的是,将这些字节包装到流对象可满足 Bitmap 类的至少一个构造函数的期望。通常,数据库 BLOB 字段只包含图像本身。但是,Northwind 却不是这样,它的情况是,图像以 78 字节的标题为前缀。因此,为了创建一个有效的对象,您必须跳过那些字节,并将摘录传递到 Bitmap 的构造函数。一般而言,上述过程很实际地说明了在绑定数据之前如何执行任何种类的任务。当达到源类型和目标类型之间的合理匹配后,您可以替换 Value 属性的当前内容。之后,该方法返回。

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值