Как обернуть текст заголовка, если мой источник данных - DataTable?

У меня есть 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, если это влияет на ответы. Кажется, это была бы простая / распространенная проблема.

2 ответа

Дайте что-то вроде этого:

Разметка:

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

Вы можете использовать собственный класс для достижения этого:

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

Затем вместо DataTable вы могли бы использовать List для привязки сетки. Затем в событии ItemDataBound вы можете привести DataItem к CustomDataRow. Если e.Item.ItemType является заголовком, установите текст заголовка. Если это элемент, установите текстовые значения.

Другие вопросы по тегам