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

发布于 2024-12-12 03:33:27 字数 697 浏览 0 评论 0原文

我有一个 GridView,其数据源动态构建为 DataTable - 考虑到我在代码中指定结构,如何指定特定于列的标题换行?

我没有找到任何方法来处理这种特定情况,因为我只需要在特定位置中包装一些列,例如在“Long”之后包装下面的第二列,但离开其他人单独。添加 \n
不起作用,因为它们只是被视为文字。

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(如果这会影响答案)。这似乎是一个简单/常见的问题。

I have a GridView whose data source is built dynamically as a DataTable - how can I specify column-specific header wrapping considering I'm specifying the structure in code?

I've not found anything to deal with this specific situation as I need to wrap only some columns in specific places, e.g. wrapping the second column below after 'Long' but leaving others alone. Adding \n or <br /> don't work as they're just treated as literals.

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();

Not sure if this is relevant, but I've found that I need to keep AutoGenerateColumns = true on my GridView otherwise nothing shows up. This is confusing me as I thought specifying the columns would do the trick - if this is unrelated to this question I'll ask another later.

Using .Net 3.5, if that affects answers. It seems like it'd be a simple/common problem.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

将军与妓 2024-12-19 03:33:28

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

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

You could use a custom class to achieve that:

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

Then, instead of a DataTable, you could use a List to bind the grid. Then, in the ItemDataBound event you could cast the DataItem to a CustomDataRow. If e.Item.ItemType is header, set the header text. If it's an item, set the Text values.

花想c 2024-12-19 03:33:28

尝试一下这样的事情:

标记:

<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/>");
}

Give something like this a shot:

Markup:

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

With a LiteralControl:

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

Code-behind:

protected string InsertLineBreaks(string val)
{
    return val.Replace("long", "long<br/>").replace("foo", "foo<br/>");
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文