Как заставить Gridview отображать THEAD?

Как мне получить элемент управления GridView для отображения тегов <thead> <tbody>? Я знаю, что .UseAccessibleHeaders заставляет <th> вместо <td> помещать <th>, но я не могу получить <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")));