Як я можу отримати Gridview для відображення THEAD?


112

Як я можу отримати GridViewелемент управління <thead> <tbody>тегами? Я знаю, .UseAccessibleHeadersце робить це <th>замість <td>, але я не можу отримати, <thead>щоб з'явитися.


FYI: UseAccessibleHeader за замовчуванням є "true", тому вам не потрібно його встановлювати. msdn.microsoft.com/en-us/library/…
MikeTeeVee

Відповіді:


187

Це слід зробити:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
HeaderRowМайно буде nullдо тих пір , GridViewпоки не пов'язані дані, тому переконайтеся , що чекати , поки не прив'язка даних сталася перед запуском вище рядки коду.
бдук

6
Як коментар нижче, якщо ASP.NET 4.5 принаймні після прив'язки не пізно - він працює в OnPreRender.
philw

У мене є перегляд сітки із доданими спеціальними підзаголовками. Кожен із цих підзаголовків відображає дані з джерела даних. Причиною, яку я хотів зробити, theadце використовувати його в jQuery. Однак після відображення заголовка, tbodyздається, він не доступний. Що може бути відсутнім у моєму випадку?
bonCodigo

1
Я виявив, що виникають проблеми під час зворотного зв’язку, і розмістив код у події, що стосується даних, яка стосується всіх сценаріїв.
Джеймс Вестгейт

Я приношу свої дані з бази даних, коли користувач натискає кнопку. У такому випадку в перегляді сітки відсутній тег thead. Будь-яка допомога?
touinta

25

Я використовую це у OnRowDataBoundвипадку:

protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
    if (e.Row.RowType == DataControlRowType.Header) {
        e.Row.TableSection = TableRowSection.TableHeader;
    }
}

7
Це єдине рішення, яке працювало на мене. Хто сконструював ці жахливі елементи управління?
EKW

2
Я вставив ваш код у подію OnRowCreate і змусив його працювати правильно.
yougotiger

Це найкраще рішення, оскільки воно вилучає ризик (і необхідну перевірку) нульового значення TableSection, якщо жодні рядки не знаходяться в DataSource.
EvilDr

1
Fyi, якщо значення GridViewв межах а, UpdatePanelа async-postback викликане іншим контролем, OnRowDataBoundподія не буде піднята, тому код у цій відповіді не буде виконаний, що призведе до GridViewповернення до візуалізації без <thead>тегів ... зітхання . Щоб орієнтуватися на цей випадок, пересуньте код із прийнятої відповіді в PreRenderобробник подій gridView (так, як пропонує відповідь ASalvo ).
Mr.Z

Це правильна відповідь, оскільки вона належним чином використовує робочий процес WebForms.
Марсель

10

Код у відповіді потрібно продовжувати Page_Loadабо GridView_PreRender. Я помістив його в метод, який викликався після Page_Loadі отримав NullReferenceException.


4
Ви також можете поставити на DataBoundвипадок. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM

4
Не знаю, чи це інше в .NET 4.5 зараз ... але я отримую, що HeaderRow є нульовим як в обробниках подій _DataBound, так і в _PreRender. Це може бути пов’язано з тим, що я використовую ASP.NET Web Forms нову функцію "Прив'язка моделі" у gridView.
ClearCloud8

7

Для цього я використовую такий код:

У 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.

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.


2

Створіть функцію та використовуйте цю функцію у 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);
        }
}

1

Я знаю, що це давнє, але ось інтерпретація відповіді 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;
        }

    }

0

Ви також можете використовувати jQuery, щоб додати його. Це дозволяє уникнути проблеми з TableRowSection.TableHeader, де потрапляє на PostBack.

$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.