如果我的数据源是DataTable,如何包装标题文本?

时间:2011-10-25 15:05:36

标签: asp.net gridview datatable headertext

我有一个GridView,其数据源是作为DataTable动态构建的 - 如果我在代码中指定结构,我如何指定特定于列的包装?

我没有找到任何处理这种特定情况的内容,因为我只需要在特定的位置中包含一些列,例如在'Long'之后将第二列包裹在下面,但留下其他人。添加\n<br />不起作用,因为它们只被视为文字。

var statsTable = new DataTable();
statsTable.Columns.Add("Run Date", typeof(DateTime));
statsTable.Columns.Add("Needlessly Long Test Header", typeof(string));
...etc

statsTable.Rows.Add(runDate, "example", ...)

gridView.DataSource = statsTable;
gridView.DataBind();

不确定这是否相关,但我发现我需要在我的GridView上保留AutoGenerateColumns = true,否则不会显示任何内容。这让我感到困惑,因为我认为指定列可以解决问题 - 如果这与此问题无关,我稍后会问另一个。

使用.Net 3.5,如果这会影响答案。这似乎是一个简单/常见的问题。

2 个答案:

答案 0 :(得分:0)

您可以使用自定义类来实现:

class CustomDataRow
{
    public string ColumnHeader { get; set; }
    public string ColumnName { get; set; }
    public string ColumnValue { get; set; }
}

然后,您可以使用List来绑定网格,而不是DataTable。然后,在ItemDataBound事件中,您可以将DataItem强制转换为CustomDataRow。如果e.Item.ItemType是标题,请设置标题文本。如果是项目,请设置文本值。

答案 1 :(得分:0)

给这样的东西一个镜头:

标记:

<asp:TemplateField>
    <HeaderTemplate>
        <%#HttpUtility.HtmlDecode(InsertBreaks(Eval("DataField")))%>
    </HeaderTemplate>
</asp:TemplateField>

使用LiteralControl:

<asp:TemplateField>
    <HeaderTemplate>
        <asp:Literal ID="litHeader" Text='<%#HttpUtility.HtmlDecode(InsertBreaks(Eval("DataField")))%>' Mode="PassThrough"></asp:Literal>
    </HeaderTemplate>
</asp:TemplateField>

代码隐藏:

protected string InsertLineBreaks(string val)
{
    return val.Replace("long", "long<br/>").replace("foo", "foo<br/>");
}