web-dev-qa-db-fra.com

Comment faire pour que Gridview rende THEAD?

Comment obtenir le contrôle GridView pour rendre le <thead><tbody> Mots clés? Je sais .UseAccessibleHeaders le fait mettre <th> au lieu de <td>, mais je ne peux pas obtenir le <thead> apparaître.

109
Andrew Bullock

Cela devrait le faire:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;
185
Phil Jenkins

J'utilise ceci dans l'événement OnRowDataBound:

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

Le code dans la réponse doit continuer Page_Load ou GridView_PreRender. Je l'ai mis dans une méthode qui s'appelait après Page_Load et a obtenu un NullReferenceException.

10
ASalvo

J'utilise le code suivant pour ce faire:

Les instructions if que j'ai ajoutées sont importantes.

Sinon (selon la façon dont vous rendez votre grille), vous lèverez des exceptions comme:

Le tableau doit contenir des sections de ligne dans l'ordre d'en-tête, de corps et de pied de page.

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);
}

L'objet this est mon GridView.

En fait, j'ai remplacé Asp.net GridView pour créer mon propre contrôle personnalisé, mais vous pouvez le coller dans votre page aspx.cs et référencer le GridView par son nom au lieu d'utiliser l'approche custom-gridview.

FYI: Je n'ai pas testé la logique du pied de page, mais je sais que cela fonctionne pour les en-têtes.

7
MikeTeeVee

Cela fonctionne pour moi:

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;
    }
}

Cela a été essayé dans VS2010.

4
Felipe Delgado

Créez une fonction et utilisez cette fonction dans votre événement PageLoad comme ceci:

La fonction est:

private void MakeGridViewPrinterFriendly(GridView gridView) {  
    if (gridView.Rows.Count > 0) {          
        gridView.UseAccessibleHeader = true;  
        gridView.HeaderRow.TableSection = TableRowSection.TableHeader;  
    }  
} 

L'événement PageLoad est:

protected void Page_Load(object sender, EventArgs e) {
        if (!IsPostBack)
        {
            MakeGridViewPrinterFriendly(grddata);
        }
}
2
Rajpurohit

Je sais que c'est vieux, mais, voici une interprétation de la réponse de MikeTeeVee, pour une vue de grille standard:

page 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;
        }

    }
1
Jonathan Harris

Vous pouvez également utiliser jQuery pour l'ajouter. Cela évite le problème avec TableRowSection.TableHeader où est supprimé sur PostBack.

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

0
Michael