我正在运行时创建一个DataTable。我的目标是将图像插入到DataTable中,最终显示在GridView中。这里的答案看上去很有希望,但我将其复制并粘贴到VS中,但它根本不起作用。我的意思是,当我在一个DataTable中显示GridView时,应该包含图片的单元格只包含字符串"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)我只学会了如何利用以编程方式创建的GridView来创建DataTable。
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中的字段显示文本“/映像/仪表板/myvastats-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或string。为了正确地看待这个问题/看看我想做什么,这是一个假期管理系统。假期一般在半天或全天进行.我们都有图标。但有时一个假期可以持续X小时。所以如果是半天,那行就需要半天的图像。如果是一整天,那行就需要全天的图像。如果时间不完全是一半或全部,代替图像,我们需要将小时数作为文本。
我认为一个可行的解决方案是将假期的时间放在隐藏的列中,然后在RowDataBound事件上使用小时的隐藏值来创建必要的图像或文本,然后这样说:
e.Row.Cells[3].Controls.Add(myImage);
我不喜欢这样做,因为它再次将我的代码分割开来,我必须始终知道单元格索引是什么,等等,我只是想将所有这些都包含在我的BuildDataTable函数中。
发布于 2012-07-04 08:26:11
编辑:在重新阅读问题之后,完整地重新使用答案.
你说:
我从不将.aspx字段用于GridView (ImageField、TemplateField等),所以我正在寻找不需要编辑.aspx代码的解决方案.
如果您只想使用AutoGenerateColumns="false"
,那么我认为您将无法在GridView中显示图像。
为了显示图像,呈现的页面必须有图像标记。除非你开始摆弄CSS 数据urls,否则就没有办法解决这个问题。
对于您的需求,这听起来非常复杂,而且它不会在所有浏览器中工作。
为了显示图像,我认为您必须手动设置GridView
。下面是一个完整的工作示例,您可以使用它作为起点(您必须调整图像urls以与项目匹配):
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();
}
}
}
https://stackoverflow.com/questions/11324396
复制相似问题