首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > VB Dotnet >

BindingNavigator和picturebox的关联有关问题

2012-01-19 
BindingNavigator和picturebox的关联问题请问如何通过BindingNavigator导航数据库中存储的图片在picturebo

BindingNavigator和picturebox的关联问题
请问如何通过BindingNavigator导航数据库中存储的图片在picturebox上显示?
数据库中的图片为二进制image类型,已经读出至dataset中。BindingNavigator的数据源已设置成BindingSource1。

                Dim   ds   As   New   DataSet
                Dim   conn   As   New   SqlConnection(My.Settings.strconn)
                Dim   strSQL   As   String   =   "select   图片   from   照片   where   索引号= ' "   &   IndexNO   &   " ' "
                Try
                        conn.Open()
                        Dim   comm   As   New   SqlCommand(strSQL,   conn)
                        Dim   reader   As   SqlDataReader   =   _
                                        comm.ExecuteReader(CommandBehavior.CloseConnection)
                        ds.Load(reader,   LoadOption.OverwriteChanges,   New   String()   { "PIC "})
                        Me.BindingSource1.DataSource   =   ds.Tables( "PIC ")
                        Me.PictureBox1.DataBindings.Add( "Image ",   Me.BindingSource1,   "图片 ")
                Catch   ex   As   Exception
                        MessageBox.Show(ex.Message)
                Finally
                        conn.Close()
                End   Try

以上代码无法显示出图片。

[解决办法]
图片里面如果放的是路径就行了,如果是二进制数据,绑定时使用模板列,可以通过一个图像web控件(或经由静态<img src= "ShowPicture.aspx?ProductID=productID " .../>标记)来观看图像
在ShowPicture页面里面,使用如下方法:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 Dim PictureID As Integer = Convert.ToInt32(Request.QueryString( "PictureID "))

  '与数据库连接并且返回指定的图片的图像内容和MIME类型
 Using myConnection As New SqlConnection(ConfigurationManager.ConnectionStrings( "ImageGalleryConnectionString ").ConnectionString)

 Const SQL As String = "SELECT [MIMEType], [ImageData] FROM [Pictures] WHERE [PictureID] = @PictureID "
 Dim myCommand As New SqlCommand(SQL, myConnection)
 myCommand.Parameters.AddWithValue( "@PictureID ", PictureID)

 myConnection.Open()
 Dim myReader As SqlDataReader = myCommand.ExecuteReader

 If myReader.Read Then
  Response.ContentType = myReader( "MIMEType ").ToString()
  Response.BinaryWrite(myReader( "ImageData "))
 End If

 myReader.Close()
 myConnection.Close()
 End Using
End Sub
[解决办法]
绑定到 BLOB 字段
Windows 窗体数据绑定很适用于 BLOB 字段(即图像),但并非以默认方式来实现。如果您尝试将 Employees.Photo 列绑定到PictureBox 的 Image 属性,会引发一个异常。



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 属性的当前内容。之后,该方法返回。

热点排行