结合ashx来在DataGrid中显示从数据库中读出的图片

2021-03-22 11:07:32 浏览数 (1)

作者:木子  http://blog.csdn.net/derny/

下面利用ashx文件可以方便实现从数据库中读取图片并显示在datagrid当中

//---------------------------------------BindImage.aspx ----------------------------------------

<%@ Page language="c#" Codebehind="BindImage.aspx.cs" AutoEventWireup="false" Inherits="ShowImage.BindImg" %> <HTML>  <HEAD>   <title>BindImg</title>  </HEAD>  <body>   <form id="Form1" method="post" runat="server">    <FONT face="宋体">     <asp:DataGrid id="MyDataGrid" runat="server" AutoGenerateColumns="False" Width="632px">      <AlternatingItemStyle BackColor="Beige"></AlternatingItemStyle>      <HeaderStyle HorizontalAlign="Center"></HeaderStyle>      <Columns>       <asp:TemplateColumn HeaderText="Photo">        <ItemTemplate>         <img src='<%# "GetImage.ashx?ID=" DataBinder.Eval(Container.DataItem,"EmployeeID")%>'>        </ItemTemplate>       </asp:TemplateColumn>       <asp:BoundColumn DataField="LastName" HeaderText="Last Name"></asp:BoundColumn>       <asp:BoundColumn DataField="FirstName" HeaderText="First Name"></asp:BoundColumn>       <asp:BoundColumn DataField="title" HeaderText="Title"></asp:BoundColumn>      </Columns>     </asp:DataGrid></FONT>   </form>  </body> </HTML>

<%@ Page language="c#" Codebehind="BindImage.aspx.cs" AutoEventWireup="false" Inherits="ShowImage.BindImage" %>

// ------------------------------------BindImage.aspx.cs ---------------------------------------------P>using System;

using System.Data;

using System.Drawing;

using System.Web; using System.Data.SqlClient;

namespace ShowImage {  ///  /// BindImg 的摘要说明。  ///  public class BindImage: System.Web.UI.Page  {   protected System.Web.UI.WebControls.DataGrid MyDataGrid;   private void Page_Load(object sender, System.EventArgs e)   {  // 在此处放置用户代码以初始化页面    if(!Page.IsPostBack)    {     SqlConnection conn = new SqlConnection(@"Server=shoutor/mydb;database=northwind;uid=sa;Pwd=shoutor");     try     {      conn.Open();      SqlCommand cmd = new SqlCommand("select employeeID,lastname,firstname,title from employees",conn);      SqlDataReader reader = cmd.ExecuteReader();      MyDataGrid.DataSource = reader;      MyDataGrid.DataBind();     }     finally     {      conn.Close();     }    }   }   #region Web 窗体设计器生成的代码   override protected void OnInit(EventArgs e)   {    //    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。    //    InitializeComponent();    base.OnInit(e);   }   ///   /// 设计器支持所需的方法 - 不要使用代码编辑器修改   /// 此方法的内容。   ///   private void InitializeComponent()   {       this.Load = new System.EventHandler(this.Page_Load);   }   #endregion  } }

//-----------------------------GetImage.ashx ---------------------------------------

<%@ WebHandler Language="C#" Class="ShowImage.GetImage" CodeBehind="GetImage.ashx.cs" %>

//--------------------------------GetImage.ashx.cs----------------------------------

using System; using System.Web; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Drawing.Imaging; using System.IO;

namespace ShowImage { ///  /// GetImg 的摘要说明。  ///  public class GetImage : IHttpHandler  {   public void ProcessRequest(HttpContext context)   {    string id = (string)context.Request["id"];    if(id!=null)    {     MemoryStream stream = new MemoryStream();     SqlConnection conn = new SqlConnection(@"Server=;database=;uid=;Pwd=");     Bitmap bm = null;     Image image = null;     try     {      conn.Open();      SqlCommand cmd = new SqlCommand("select photo from employees where employeeid='" id "'",conn);      byte[] blob = (byte[])cmd.ExecuteScalar();      stream.Write (blob,78,blob.Length-78);      bm = new Bitmap(stream);

     int width=48;      int height = (int)(width*((double)bm.Height/(double)bm.Width));

    // GetThumbnailImage生成缩略图      image = bm.GetThumbnailImage(width,height,null,IntPtr.Zero);

     context.Response.ContentType = "image/jpeg";

     image.Save(context.Response.OutputStream,ImageFormat.Jpeg);     }     finally     {      if(image!=null)       image.Dispose();      if(bm!=null)       bm.Dispose();      stream.Close();      conn.Close();     }    }   }   public bool IsReusable   {    get    {     return true;    }   }    } }

ProcessRequest使用了空架类库的易用的Image.GetThumbnailImage方法来把位图缩小到宽度为48像素,同时保持图象的长宽比。可以使用类似的技术来创建显示来自其他数据库图象的DataGrid。基本的思想是使用模板列来输出一个引用某个HTTP处理句柄的<img>标签,并在查询字符串中包含唯一标识图片所在的记录的信息。之后,HTTP处理句柄使用ADO.NET来获取图象数据位,并使用GDI (图象设备接口 )来构建图象。

本文由来源 21aspnet,由 javajgs_com 整理编辑,其版权均为 21aspnet 所有,文章内容系作者个人观点,不代表 Java架构师必看 对观点赞同或支持。如需转载,请注明文章来源。

0 人点赞