如何在不将其保存到硬盘驱动器的情况下在gridview行中显示图片?

时间:2012-02-20 14:37:25

标签: c# asp.net gridview

我正在创建一个购物网站。我有一个gridview绑定到一个objectdatasource控件用于管理任务。此网格负责显示sql server数据库中的items表。每个项目也可能有也可能没有图片。因此,当向管理员显示此网格时,我希望相关图像的小缩略图可用于每一行。这是gridview代码:

<asp:GridView ID="gridview1" runat="server" 
   DataSourceID="objDataSource" DataKeyNames="item_id">
    <Columns>
        <asp:BoundField DataField="item_category" Visible="false" />
        <asp:BoundField HtmlEncode="true" DataField="item_name" 
            HeaderText="Item Name" />
        <asp:BoundField HtmlEncode="true" NullDisplayText="Not Set" 
            DataField="item_desc" HeaderText="Item Description" />
        <asp:TemplateField HeaderText="Item Picture"
            ItemStyle-Width="40px" ItemStyle-Height="40px">
            <ItemTemplate>
                <!-- here should be the image -->
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ButtonType="Button" ShowSelectButton="True"
            HeaderText="Selecting" />
    </Columns>
</asp:GridView>

我只知道在浏览器中显示图片时有两个选项:

  • 在响应流上保存位图。当渲染到客户端时,这不会在gridview内部(正确吗?)。
  • 在select语句后将位图保存在硬盘驱动器上,并在模板内部使用图像控件,然后动态分配ImageUrl属性。

第二个选项太昂贵,因为它需要在硬盘上为每个图像(或数据行)写入和读取。那怎么能这样呢?它甚至可能吗?

ps: ajax不是一个选项。

2 个答案:

答案 0 :(得分:4)

创建一个处理图像的ASP.NET Web处理程序(.ashx文件),将图像的id传递给gridview,并创建一个指向该图像处理程序的“链接”,如果图像存在,则显示该图像,或者可能会显示“无图像可用”图像

以下是ASHX文件的快速教程:http://www.dotnetperls.com/ashx

如果您需要,我可以发布其他代码

答案 1 :(得分:2)

可以将原始图像数据内嵌到HTML中。这不是一种常用的技术,但确实有效 - 有关详细信息,请参阅http://www.websiteoptimization.com/speed/tweak/inline-images/

有些事情需要牢记:这并不适用于所有浏览器 - 例如,就我所知,IE7及更早版本不支持此功能。此外,这不是一个非常节省空间的方式来发送位图,所以除非它们真的很小,否则这是一个糟糕的主意。 (虽然对于足够小的位图,单独下载中涉及的HTTP开销可能比内联映像的开销略差。此外,如果您可以为服务器上的HTTP页启用压缩,那么内联位图看起来会稍微不那么糟糕。)

但总的来说,你可能会更好地使用Anthony Shaw提出的单独处理程序。这可能是一个更好的解决方案,除非这些图像非常小。