【转】GridView中显示数据库里的图片
原文链接:http://blog.joycode.com/liuhuimiao/archive/2005/06/03/52554.aspx
很多人开始有这个疑问,GridView控件中的ImageField没有DataField属性,那么如何才能绑定到SQL Server中的Image Field?自从DynamicImage控件从beta2中消失后,这就成了个问题。但是,ASP.NET2.0随之也给我们带来了另外一种解决方案,那就是方便地利用HttpHandler(.ashx)动态显示数据库中的图片,这点在VS2005中提供了PersonalWebSite等模版中已经给出方案:通过ashx动态获取数据库中的某条图片数据,然后在GridView等控件的自定义模版中安置一个Image控件,并设置Image控件的ImageUrl属性为类似 XXX.ashx?photoId=1 即可显示图片。
下面为Handler.ashx的代码:
<%@ WebHandler Language="C#" Class="Handler" %>
![]()
using System;
using System.Data;
using System.Data.SqlClient;
using System.IO;
using System.Web;
using System.Configuration;
![]()
public class Handler : IHttpHandler {
![]()
public bool IsReusable {
get {
return true;
}
}
![]()
public void ProcessRequest(HttpContext context) {
// Set up the response settings
context.Response.ContentType = "image/jpeg";
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.BufferOutput = false;
![]()
int photoId = -1;
Stream stream = null;
![]()
if (context.Request.QueryString["PhotoID"] != null &&
context.Request.QueryString["PhotoID"] != "") {
photoId = Convert.ToInt32(context.Request.QueryString["PhotoID"]);
stream = GetPhoto(photoId);
}
![]()
const int buffersize = 1024 * 16;
byte[] buffer = new byte[buffersize];
int count = stream.Read(buffer, 0, buffersize);
while (count > 0) {
context.Response.OutputStream.Write(buffer, 0, count);
count = stream.Read(buffer, 0, buffersize);
}
}
![]()
public Stream GetPhoto(int photoId) {
SqlConnection myConnection = new SqlConnection(
ConfigurationManager.ConnectionStrings["Personal"].ConnectionString);
SqlCommand myCommand = new SqlCommand
("SELECT [BytesOriginal] FROM [Photos] WHERE [PhotoID]=@PhotoID",
myConnection);
myCommand.CommandType = CommandType.Text;
myCommand.Parameters.Add(new SqlParameter("@PhotoID", photoId));
myConnection.Open();
object result = myCommand.ExecuteScalar();
![]()
try {
return new MemoryStream((byte[])result);
}
catch (ArgumentNullException e) {
return null;
}
finally {
myConnection.Close();
}
}
}
然后在GridView中自定义模版列:
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="Image1" runat="server"
ImageUrl='<%# "Handler.ashx?PhotoID=" + Eval("PhotoID") %>' />
</ItemTemplate>
</asp:TemplateField>
这样即可在GridView中动态显示数据库中image类型图片数据了。其实VS2005自带的Stater Kit很有用的,另外,还有其他几个Club Web Site Starter Kit等,都可以在asp.net上载过来看看。
本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利
This posting is provided "AS IS" with no warranties, and confers no rights.
This posting is provided "AS IS" with no warranties, and confers no rights.




}
}
浙公网安备 33010602011771号