Как мне заставить GridViewэлемент управления отображать <thead><tbody>теги? Я знаю, .UseAccessibleHeadersзаставляет его поставить <th>вместо <td>, но я не могу заставить <thead>его появиться.
HeaderRowИмущество будет nullдо тех пор , GridViewпока не связаны данные, поэтому убедитесь , что ждать , пока не привязка данных произошла перед запуском выше строки кода.
bdukes
6
Как комментарий ниже, с ASP.NET 4.5, по крайней мере, после того, как привязка не достаточно поздно, однако она работает в OnPreRender.
philw 06
У меня есть сетка с добавленными настраиваемыми подзаголовками. Каждый из этих подзаголовков показывает данные из источника данных. Причина, по которой я хотел визуализировать, thead- использовать его в jQuery. Однако после рендеринга заголовка tbodyкажется, что он недоступен. Чего может не хватать в моем случае?
bonCodigo
1
Я обнаружил, что во время обратной передачи все еще существуют проблемы, и поместил код в событие привязки данных, которое адресовало все сценарии.
Джеймс Вестгейт
Я беру свои данные из базы данных, когда пользователь нажимает кнопку. В этом случае в gridview отсутствует тег thead. Любая помощь?
Это единственное решение, которое у меня сработало. Кто разработал эти ужасные средства управления?
EKW,
2
Я вставил ваш код в событие OnRowCreated и заставил его работать правильно.
yougotiger 08
Это лучшее решение, поскольку оно устраняет риск (и обязательную проверку) того, что TableSection будет нулевым, если в DataSource нет строк.
EvilDr
1
Fyi, если это GridViewнаходится внутри, UpdatePanelа асинхронная обратная передача вызвана каким-либо другим элементом управления, тогда OnRowDataBoundсобытие не будет вызвано, поэтому код в этом ответе не будет выполнен, что приведет к GridViewвозврату к рендерингу без <thead>тегов ... вздох . Чтобы нацеливаться на этот случай, вставьте код из принятого ответа в PreRenderобработчик событий gridView (так же, как предлагает ответ ASalvo ).
Mr.Z
Это правильный ответ, поскольку он правильно использует рабочий процесс WebForms.
Марсель
10
Код в ответе должен продолжаться Page_Loadили GridView_PreRender. Я поместил его в метод, который был вызван после, Page_Loadи получил NullReferenceException.
Также можно поставить на DataBoundмероприятие. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM,
4
Не знаю, изменилось ли это сейчас в .NET 4.5 ... но я получаю, что HeaderRow имеет значение null в обработчиках событий _DataBound и _PreRender. Это может быть связано с тем, что я использую новую функцию «Связывание модели» веб-форм ASP.NET в gridView.
ClearCloud8,
7
Для этого я использую следующий код:
В ifзаявлении , которые я добавил важно.
В противном случае (в зависимости от того, как вы визуализируете свою сетку) вы создадите исключения вроде:
Таблица должна содержать разделы строк в следующем порядке: верхний, основной и нижний колонтитулы.
protectedoverridevoidOnPreRender(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.
К вашему сведению: я не тестировал логику нижнего колонтитула, но знаю, что это работает для заголовков.
Вы также можете использовать jQuery, чтобы добавить его. Это позволяет избежать проблемы с TableRowSection.TableHeader, которая отбрасывается в PostBack.
Ответы:
Это должно сделать это:
источник
HeaderRow
Имущество будетnull
до тех пор ,GridView
пока не связаны данные, поэтому убедитесь , что ждать , пока не привязка данных произошла перед запуском выше строки кода.thead
- использовать его в jQuery. Однако после рендеринга заголовкаtbody
кажется, что он недоступен. Чего может не хватать в моем случае?Я использую это в
OnRowDataBound
случае:источник
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
заявлении , которые я добавил важно.В противном случае (в зависимости от того, как вы визуализируете свою сетку) вы создадите исключения вроде:
this
Объект мой GridView.Я фактически переопределил Asp.net GridView, чтобы создать свой собственный настраиваемый элемент управления, но вы можете вставить его на свою страницу aspx.cs и ссылаться на GridView по имени вместо использования подхода custom-gridview.
К вашему сведению: я не тестировал логику нижнего колонтитула, но знаю, что это работает для заголовков.
источник
Это работает для меня:
Это было пробовано в VS2010.
источник
Я знаю, что это устарело, но вот интерпретация ответа MikeTeeVee для стандартного представления сетки:
страница aspx:
aspx.cs:
источник
Создайте функцию и используйте ее в своем
PageLoad
мероприятии следующим образом:Функция:
PageLoad
Событие:источник
Вы также можете использовать jQuery, чтобы добавить его. Это позволяет избежать проблемы с TableRowSection.TableHeader, которая отбрасывается в PostBack.
$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));
источник