使用DataGrid显示来自于数据库的图象

转载 2006年06月02日 14:22:00

前言

我们如何创建一个DataGrid列,显示从数据库中获得的图像?

这是一个经常被问及的关于DataGrid控件的问题,而且其他可以很容易地通过结合你已经知道的关于模板列的内容以及一点点关于HTTP处理句柄(HTTP Handler)的知识来回答。

下面使用NorthWind数据库的Employees表来在一个DataGrid中显示数据库中的图像。

代码

--- BindImg.aspx

<%@ Page language="c#" Codebehind="BindImg.aspx.cs" AutoEventWireup="false" Inherits="ShowImg.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='<%# "GetImg.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>

--- BindImg.aspx.cs

using System;
using System.Data;
using System.Drawing;
using System.Web;

using System.Data.SqlClient;

namespace ShowImg
{
 
/// <summary>
 /// BindImg 的摘要说明。
 /// </summary>

 public class BindImg : 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);
  }
  
  
/// <summary>
  /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  /// 此方法的内容。
  /// </summary>

  private void InitializeComponent()
  {   
   this.Load += new System.EventHandler(this.Page_Load);
  }
 
 #endregion
 }
}

--- GetImg.ashx

<%@ WebHandler Language="C#" Class="ShowImg.GetImg" %>
 
--- GetImg.aspx.cs

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

namespace ShowImg
{
 
/// <summary>
 /// GetImg 的摘要说明。
 /// </summary>

 public class GetImg : IHttpHandler
 {
  public void ProcessRequest(HttpContext context)
  {
   string id = (string)context.Request["id"];
   if(id!=null)
   {
    MemoryStream stream = new MemoryStream();
    SqlConnection conn = new SqlConnection(@"Server=shoutor/mydb;database=northwind;uid=sa;Pwd=shoutor");
    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();
    }
   }
  }
  
  // 实现成员接口(System.Web.IHttpHandler.IsReusable)
  public bool IsReusable
  {
   get
   {
    return true;
   }
  }  
 }
}
 
总结

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

相关文章推荐

Windows Mobile常用程序代码(串口、图象、网络、3D、数据库、音频视频等等)

Windows Mobile常用程序代码(串口、图象、网络、3D、数据库、音频视频等等)
  • cpcpc
  • cpcpc
  • 2011年02月24日 13:47
  • 9590

JQuery EasyUI 学习——Struts2与EasyUI DataGrid数据表格结合使用显示数据库数据

因为EasyUI DataGrid只要取出后台传过来的一定格式的JSON数据,就可以在前台页面数据表格中,以一定形式显示数据库中的数据。此处,我们使用Struts2框架整合DataGrid,实现数据的...
  • NIITYZU
  • NIITYZU
  • 2015年04月20日 20:26
  • 1510

在窗口中显示一幅 JPG 图象

本实例是《杨老师之Blog——COM组件设计与应用(四)》中的实例三,本人实现后并加以注释。 void CShowJPGView::OnDraw(CDC* pDC) {   CShowJPGDo...

VC++中bmp图象的显示

前段时间想用VC的对话框来动态地显示一副BMP位图,查了很多篇文章发现都写的很复杂(而且貌似许多都是复制粘贴而来),真正有价值的不多.其实VC显示BMP文件是很方便的,所有的代码加在一起也不过五六行而...

数字图像处理:第二章 图象获取、显示、表示与处理

第二章 图象获取、显示、表示与处理 图象获取是图象的数字化过程,显示则是将数字图象转化为适合人们使用的形式,而处理是通过软件对图象进行变换操作的过程。 目录 图象获取图象显示图象表示图象处理...

如何用12864液晶显示图片和绘制任意函数图象(打点)

本帖最后由 赛伯Man 于 2013-7-30 22:52 编辑 此贴源自:http://bbs.elecfans.com/forum.ph ... 057&highlight=12864 ...
  • TXF1984
  • TXF1984
  • 2015年06月13日 15:15
  • 2686

在Framebuffer下编程显示BMP图象 分享

http://yaos.blog.sohu.com/20240931.html今天看别人的代码,知道可以使控制台进入图形模式,这样SHELL程序的显示就不会影响BMP图像的显示了。于是,COPY过来,...
  • yuyin86
  • yuyin86
  • 2011年07月06日 11:16
  • 799

PHP imagecreate 图象无法显示 wamp环境下如何安装GD库

网上见很多朋友因为PHP里GD库的问题烦恼不已。鉴于GD库的强大功能,如果你用不了GD库将是你编程路上的一个小小的阻碍。呵呵……(0-0) 废话少说,在此说说在wamp环境下安装GD库的操作说明: ...

一个基于opencv的显示一个rgb图像各点灰度值及对应的灰度图象灰度值的程序

运行时使用鼠标左键点图像上任意点,即可显示该点rgb图像各通道的值及该图像对应的灰度图象的灰度值 //PixelValueMonitor.h #include "cv.h" #include...
  • C_arm
  • C_arm
  • 2011年11月01日 06:50
  • 4582

SDL资料(四):显示一幅图象

SDL系列教程(四):显示一幅图象 作者:akinggw 在上两篇教程中,我们学习了什么是SDL和SDL的配置。在这一章中,我们将学习如何将一幅图象显示到屏幕上。 首先,按照我前面所说的方法建...
  • lp2007
  • lp2007
  • 2011年11月23日 17:56
  • 382
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用DataGrid显示来自于数据库的图象
举报原因:
原因补充:

(最多只允许输入30个字)