Наконец-то нашли обходной путь для этого.Я не уверен, имеет ли этот код какое-либо отношение к хорошим практикам ASP.NET, но он помогает:
public class FirstColumnHeaderGridView : GridView
{
protected override void InitializeRow(GridViewRow row, DataControlField[] fields)
{
DataControlFieldCell cell = new DataControlFieldHeaderCell(fields[0]);
DataControlCellType header = DataControlCellType.DataCell;
fields[0].InitializeCell(cell, header, row.RowState, row.RowIndex);
row.Cells.Add(cell);
DataControlField[] newFields = new DataControlField[fields.Length - 1];
for (int i = 1; i < fields.Length; i++)
{
newFields[i - 1] = fields[i];
}
base.InitializeRow(row, newFields);
}
}
Позвольте мне объяснить, что здесь происходит.Мы создаем специальный тип GridView
, который будет отображать свой первый столбец с использованием тегов <th>
независимо от того, как создается этот столбец.Для этого мы переопределяем метод InitializeRow
.Этот метод в основном настраивает ячейки для строки.Мы обрабатываем первую ячейку, и пусть стандарт GridView
позаботится обо всем остальном.
Конфигурация, которую мы применяем к ячейке, полностью взята из реализации GridView
, и для нее достаточноотображается с тегом <th>
вместо <td>
.
После этого обходного пути использование является абсолютно стандартным - зарегистрируйте наш класс в качестве серверного элемента управления и используйте его как обычно GridView
:
<%@ Register Assembly="WebApplication1" Namespace="WebApplication1" TagPrefix="wa1" %>
...
<wa1:FirstColumnHeaderGridView ID="Grid1" runat="server" ...>
<Columns>
<asp:TemplateField>
<ItemTemplate>
Will be inside th
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
Will be inside td
</ItemTemplate>
</asp:TemplateField>
</Columns>
</wa1:FirstColumnHeaderGridView>