首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向DataTable添加图像

向DataTable添加图像
EN

Stack Overflow用户
提问于 2012-07-04 07:33:16
回答 1查看 12.2K关注 0票数 0

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

下面是DataTable的构造和填充的一个非常简略的版本:

代码语言:javascript
运行
复制
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)应用程序的所有其他页面都使用这种样式,因此我希望保持它的一致性。

那我试过什么?

代码语言:javascript
运行
复制
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[]“。

代码语言:javascript
运行
复制
DataColumn imagecol = new DataColumn();
//...
newrow[amountcol] = ResolveUrl("~/images/dashboard/myvacstatus-ampm.png");

结果: GridView中的字段显示文本“/映像/仪表板/myvastats-ampm.png”

代码语言:javascript
运行
复制
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事件上使用小时的隐藏值来创建必要的图像或文本,然后这样说:

代码语言:javascript
运行
复制
e.Row.Cells[3].Controls.Add(myImage);

我不喜欢这样做,因为它再次将我的代码分割开来,我必须始终知道单元格索引是什么,等等,我只是想将所有这些都包含在我的BuildDataTable函数中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-04 08:26:11

编辑:在重新阅读问题之后,完整地重新使用答案.

你说:

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

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

为了显示图像,呈现的页面必须有图像标记。除非你开始摆弄CSS 数据urls,否则就没有办法解决这个问题。

对于您的需求,这听起来非常复杂,而且它不会在所有浏览器中工作。

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

aspx文件中的

代码语言:javascript
运行
复制
<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>

文件代码背后的

代码语言:javascript
运行
复制
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();
        }
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11324396

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档