Как мне заставить GridView
элемент управления отображать <thead>
<tbody>
теги? Я знаю, .UseAccessibleHeaders
заставляет его поставить <th>
вместо <td>
, но я не могу заставить <thead>
его появиться.
Как мне заставить GridView
элемент управления отображать <thead>
<tbody>
теги? Я знаю, .UseAccessibleHeaders
заставляет его поставить <th>
вместо <td>
, но я не могу заставить <thead>
его появиться.
Ответы:
Это должно сделать это:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
Имущество будет null
до тех пор , GridView
пока не связаны данные, поэтому убедитесь , что ждать , пока не привязка данных произошла перед запуском выше строки кода.
thead
- использовать его в jQuery. Однако после рендеринга заголовка tbody
кажется, что он недоступен. Чего может не хватать в моем случае?
Я использую это в OnRowDataBound
случае:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
находится внутри, UpdatePanel
а асинхронная обратная передача вызвана каким-либо другим элементом управления, тогда OnRowDataBound
событие не будет вызвано, поэтому код в этом ответе не будет выполнен, что приведет к GridView
возврату к рендерингу без <thead>
тегов ... вздох . Чтобы нацеливаться на этот случай, вставьте код из принятого ответа в PreRender
обработчик событий gridView (так же, как предлагает ответ ASalvo ).
Код в ответе должен продолжаться Page_Load
или GridView_PreRender
. Я поместил его в метод, который был вызван после, Page_Load
и получил NullReferenceException
.
DataBound
мероприятие. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
Для этого я использую следующий код:
В 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 по имени вместо использования подхода custom-gridview.
К вашему сведению: я не тестировал логику нижнего колонтитула, но знаю, что это работает для заголовков.
Это работает для меня:
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.
Я знаю, что это устарело, но вот интерпретация ответа MikeTeeVee для стандартного представления сетки:
страница 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;
}
}
Создайте функцию и используйте ее в своем 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);
}
}