C# 向数据表添加图像

C# 向数据表添加图像,c#,asp.net,image,gridview,datatable,C#,Asp.net,Image,Gridview,Datatable,我正在运行时创建一个数据表。我的目标是在DataTable中插入一个图像,最终显示在GridView中。答案看起来很有希望,但我复制并粘贴到VS中,结果根本不起作用。“不工作”是指当我在GridView中显示DataTable时,应该包含图片的单元格只包含字符串“System.Byte[]” 下面是DataTable的构造和填充的一个非常简短的版本: DataTable dt = new DataTable(); DataColumn imagecol = new DataColumn(); d

我正在运行时创建一个数据表。我的目标是在DataTable中插入一个图像,最终显示在GridView中。答案看起来很有希望,但我复制并粘贴到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);
}
(ReadImage函数将图像转换为字节数组)

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


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


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


我的最终要求是,该字段必须具有灵活性,可以是图像或字符串。为了更好地理解这一点/了解我正在尝试做什么,这是一个假期管理系统。假期一般是半天或全天。我们两个都有图标。但有时一次假期可以持续X个小时。因此,在正好是半天的情况下,该行需要半天的图像。如果是全天,则该行需要全天的图像。如果时间既不是一半也不是全部,我们需要将小时数作为文本来代替图像

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

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

我不喜欢这样,因为它会再次拆分我的代码,我必须始终知道单元格索引是什么,等等。我真的只想让所有这些都包含我的BuildDataTable函数。

编辑:重新阅读问题后,完成答案的重新布线

你说:

我从不将.aspx字段用于GridView(ImageField, TemplateField等),所以我正在寻找不需要 正在编辑.aspx代码

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

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

对于您的需求来说,这听起来非常复杂,而且无论如何也不能在所有浏览器中工作

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

在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();
        }
    }
}

代码隐藏文件

<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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用系统集合;
使用系统数据;
公共部分类GridViewTest:System.Web.UI.Page
{
公共只读int FullDayHours=8;
公共只读整数半天小时=4;
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
DataTable gridViewSource=新DataTable();
DataColumn oneColumn=新的DataColumn(“SomeOtherField”);
oneColumn.DataType=System.Type.GetType(“System.String”);
gridViewSource.Columns.Add(oneColumn);
oneColumn=新数据列(“HoursField”);
oneColumn.DataType=System.Type.GetType(“System.Int32”);
gridViewSource.Columns.Add(oneColumn);
对于(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;
例如,DataBind();
}
}
}
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();
        }
    }
}