0

我有一个 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();

不确定这是否相关,但我发现我需要保留AutoGenerateColumns = true我的 GridView 否则什么都不会显示。这让我感到困惑,因为我认为指定列会起作用 - 如果这与这个问题无关,我稍后会问另一个问题。

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

4

2 回答 2

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 为表头,则设置表头文本。如果它是一个项目,请设置文本值。

于 2011-10-25T16:10:08.543 回答
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/>");
}
于 2011-10-25T16:52:39.470 回答