Как мне получить элемент управления GridView
для отображения тегов <thead>
<tbody>
? Я знаю, что .UseAccessibleHeaders
заставляет <th>
вместо <td>
помещать <th>
, но я не могу получить <thead>
.
Как заставить Gridview отображать THEAD?
Ответ 1
Это должно сделать это:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
Ответ 2
Я использую это в событии OnRowDataBound
:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
Ответ 3
Код в ответе должен идти Page_Load
или GridView_PreRender
. Я положил его в метод, который был вызван после Page_Load
и получил NullReferenceException
.
Ответ 4
Для этого я использую следующий код:
Операторы if
, которые я добавил, важны.
В противном случае (в зависимости от того, как вы создаете сетку) вы будете генерировать исключения, например:
Таблица должна содержать разделы строки в порядке заголовка, тела и нижнего колонтитула.
protected override void OnPreRender(EventArgs e)
{
if ( (this.ShowHeader == true && this.Rows.Count > 0)
|| (this.ShowHeaderWhenEmpty == true))
{
//Force GridView to use <thead> instead of <tbody> - 11/03/2013 - MCR.
this.HeaderRow.TableSection = TableRowSection.TableHeader;
}
if (this.ShowFooter == true && this.Rows.Count > 0)
{
//Force GridView to use <tfoot> instead of <tbody> - 11/03/2013 - MCR.
this.FooterRow.TableSection = TableRowSection.TableFooter;
}
base.OnPreRender(e);
}
Объектом this
является мой GridView.
Я действительно переопределяю Asp.net GridView, чтобы создать собственный пользовательский элемент управления, но вы можете вставить его на свою страницу aspx.cs и ссылаться на GridView по имени вместо использования подхода с настраиваемым gridview.
FYI: Я не тестировал логику нижнего колонтитула, но я знаю, что это работает для заголовков.
Ответ 5
Это работает для меня:
protected void GrdPagosRowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
e.Row.TableSection = TableRowSection.TableBody;
}
else if (e.Row.RowType == DataControlRowType.Header)
{
e.Row.TableSection = TableRowSection.TableHeader;
}
else if (e.Row.RowType == DataControlRowType.Footer)
{
e.Row.TableSection = TableRowSection.TableFooter;
}
}
Это было выполнено в VS2010.
Ответ 6
Создайте функцию и используйте эту функцию в своем PageLoad
событии следующим образом:
Функция:
private void MakeGridViewPrinterFriendly(GridView gridView) {
if (gridView.Rows.Count > 0) {
gridView.UseAccessibleHeader = true;
gridView.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}
Событие PageLoad
:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}
Ответ 7
Я знаю, что это старо, но здесь интерпретация ответа MikeTeeVee для стандартного gridview:
Страница aspx:
<asp:GridView ID="GridView1" runat="server"
OnPreRender="GridView_PreRender">
aspx.cs:
protected void GridView_PreRender(object sender, EventArgs e)
{
GridView gv = (GridView)sender;
if ((gv.ShowHeader == true && gv.Rows.Count > 0)
|| (gv.ShowHeaderWhenEmpty == true))
{
//Force GridView to use <thead> instead of <tbody> - 11/03/2013 - MCR.
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
}
if (gv.ShowFooter == true && gv.Rows.Count > 0)
{
//Force GridView to use <tfoot> instead of <tbody> - 11/03/2013 - MCR.
gv.FooterRow.TableSection = TableRowSection.TableFooter;
}
}
Ответ 8
Вы также можете использовать jQuery, чтобы добавить его. Это позволяет избежать проблемы с TableRowSection.TableHeader, где он отбрасывается на PostBack.
$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));