我正在运行时创建一个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函数。
答案 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();
}
}
}