我正在运行时创建一个 DataTable。我的目标是将图像插入 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);
}
* 部分是我一直失败的地方。
我从不将 .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”
我的最后一个要求是该字段必须具有成为图像或字符串的灵活性。为了透视这个/看看我想要做什么,这是一个假期管理系统。假期一般为半天或全天。我们有两者的图标。但有时假期可以持续 X 小时。因此,在恰好是半天的情况下,该行需要半天的图像。如果是全天,则该行需要全天的图像。如果时间量既不是一半也不是完整的,在图像的位置,我们需要将小时数作为文本放置。
我认为可行的一种可能的解决方案是将假期的时间放在隐藏列中,然后在 RowDataBound 事件上,使用小时的隐藏值来创建必要的图像或文本,然后说:
e.Row.Cells[3].Controls.Add(myImage);
我不喜欢这样,因为它再次拆分了我的代码,我必须始终只知道 Cells 索引是什么,等等。我真的只想让所有这些都包含我的 BuildDataTable 函数。