将图像添加到DataTable

时间:2012-07-04 07:33:17

标签: c# asp.net image gridview datatable

我正在运行时创建一个DataTable。我的目标是将图像插入DataTable,最终显示在GridView中。答案HERE看起来很有希望,但我将其复制并粘贴到VS中,它根本不起作用。通过“不起作用”,我的意思是当我在GridView中显示DataTable时,应该包含图片的单元格只包含字符串“System.Byte []”

以下是DataTable的构造和填充的缩写版本:

DataTable dt = new DataTable();
DataColumn imagecol = new DataColumn();
dt.Columns.Add(imagecol);

DataRow newrow;

for (int x = 0, x < 10; x++)
{
    newrow = dt.NewRow();
    newrow[imagecol] = *********
    dt.Add(newrow);
}

*部分是我一直失败的地方。

我从不使用.aspx字段用于GridView(ImageField,TemplateField等),因此我正在寻找不需要编辑.aspx代码或为特定DataTable“准备”GridView的解决方案列。在有人问之前我先回答一下。我的理由是:

A)我只学过如何用编程创建的DataTable制作GridView。

B)我不喜欢,如果我想在某个时候更改我的字段,我必须在两个地方进行编辑,而不是仅仅一个。

C)应用程序的所有其他页面都使用此样式,因此我希望保持一致。

那我试过了什么?


DataColumn imagecol = new DataColumn();
imagecol.DataType = System.Type.GetType("System.Byte[]");
//...
newrow[amountcol] = ReadImage(Server.MapPath("~/images/dashboard/myvacstatus-ampm.png"), new string[] { ".png" });

(ReadImage函数将图像转换为字节数组)

结果:GridView中的字段显示文本“System.Byte []”。


DataColumn imagecol = new DataColumn();
//...
newrow[amountcol] = ResolveUrl("~/images/dashboard/myvacstatus-ampm.png");

结果:GridView中的字段显示文本“/images/dashboard/myvacstatus-ampm.png”


DataColumn imagecol = new DataColumn();
//...
Image timeImg = new Image();
timeImg.ImageUrl = "/images/dashboard/myvacstatus-ampm.png"
newrow[amountcol] = timeImg;

结果:GridView中的字段显示文本“System.Web.UI.WebControls.Image”


我最后的要求是,这个字段必须具有成为Image或字符串的灵活性。为了正确看待这个/看我正在尝试做什么,这是一个度假管理系统。假期通常在半天或全天进行。我们有两个图标。但有时度假可以持续X个小时。因此,如果它恰好是半天,则该行需要半天的图像。如果是全天,该行需要全天图像。如果时间量既不是正好的一半也不是完整的,代替图像,我们需要将小时数作为文本。

我认为可行的一种解决方案是将休假时间放在隐藏列中,然后在RowDataBound事件上,使用隐藏的小时值来创建必要的图像或文本,然后说: / p>

e.Row.Cells[3].Controls.Add(myImage);

我不喜欢这个因为它再次拆分我的代码,我必须总是只知道Cell索引是什么,等等。我真的只想保留所有它包含我的BuildDataTable函数。

1 个答案:

答案 0 :(得分:2)

修改:重新阅读问题后完成答案的重写。

你说:

  

我从不使用GridView的.aspx字段(ImageField,   TemplateField等),所以我正在寻找不需要的解决方案   编辑.aspx代码......

如果您只想使用AutoGenerateColumns="false",那么我认为您无法在GridView中显示图像。

为了显示图像,渲染页面必须具有图像标记。没办法解决这个问题,除非你开始摆弄CSS data urls

对于您的要求听起来非常复杂,无论如何它都无法在所有浏览器中使用。

要显示图片,我认为您必须手动设置GridView。这是一个完整的工作示例,您可以将其用作起点(您必须调整图像网址以匹配您的项目):

在aspx文件中

<asp:GridView ID="example" runat="server" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="Some other field" DataField="SomeOtherField" />
        <asp:TemplateField HeaderText="Image/Text">
            <ItemTemplate>
                <asp:Image ID="FullDay" runat="server" Visible='<%# ((int)Eval("HoursField")) == this.FullDayHours %>'
                    ImageUrl="~/images/dashboard/fullDayImage.png" />
                <asp:Image ID="HalfDay" runat="server" Visible='<%# ((int)Eval("HoursField")) == this.HalfDayHours %>'
                    ImageUrl="~/images/dashboard/halfDayImage.png" />
                <asp:Literal ID="ShowHours" runat="server" Visible='<%# ((int)Eval("HoursField")) != this.HalfDayHours  && ((int)Eval("HoursField")) != this.FullDayHours %>'
                    Text='<%# Eval("HoursField") %>'></asp:Literal>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

代码隐藏文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;
using System.Data;

public partial class GridViewTest : System.Web.UI.Page
{
    public readonly int FullDayHours = 8;
    public readonly int HalfDayHours = 4;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable gridViewSource = new DataTable();

            DataColumn oneColumn = new DataColumn("SomeOtherField");
            oneColumn.DataType = System.Type.GetType("System.String");
            gridViewSource.Columns.Add(oneColumn);

            oneColumn = new DataColumn("HoursField");
            oneColumn.DataType = System.Type.GetType("System.Int32");
            gridViewSource.Columns.Add(oneColumn);

            for (int i = 0; i < 10; i++)
            {
                DataRow oneRow = gridViewSource.NewRow();
                oneRow["SomeOtherField"] = "Other field " + i.ToString();
                oneRow["HoursField"] = i;
                gridViewSource.Rows.Add(oneRow);
            }
            example.DataSource = gridViewSource;
            example.DataBind();
        }
    }
}