Comment obtenir le GridViewcontrôle pour rendre les <thead><tbody>balises? Je sais .UseAccessibleHeadersqu'il le met à la <th>place de <td>, mais je ne peux pas faire <thead>apparaître le.
La HeaderRowpropriété sera nulljusqu'à ce que les GridViewdonnées soient liées, assurez-vous donc d'attendre que la liaison de données se soit produite avant d'exécuter la ligne de code ci-dessus.
bdukes
6
Comme commentaire ci-dessous, avec ASP.NET 4.5 au moins après la liaison, ce n'est pas assez tard - cela fonctionne dans OnPreRender cependant.
philw
J'ai un gridview avec des sous-en-têtes personnalisés ajoutés. Chacun de ces sous-en-têtes affiche les données de la source de données. La raison pour laquelle je voulais effectuer un rendu theadest de l'utiliser dans jQuery. Cependant, après le rendu de l'en-tête, le tbodyne semble pas être disponible. Que manque-t-il dans mon cas?
bonCodigo
1
J'ai trouvé qu'il y avait encore des problèmes lors de la publication et j'ai placé le code dans l'événement lié aux données qui traitait tous les scénarios.
James Westgate
J'apporte mes données à partir d'une base de données lorsque l'utilisateur clique sur un bouton. Dans ce cas, le gridview n'a pas la balise thead. De l'aide?
C'est la seule solution qui a fonctionné pour moi. Qui a conçu ces terribles contrôles?
EKW
2
J'ai inséré votre code dans l'événement OnRowCreated et je l'ai fait fonctionner correctement.
yougotiger
Il s'agit de la meilleure solution, car elle supprime le risque (et la vérification requise) que la TableSection soit nulle si aucune ligne ne se trouve dans le DataSource.
EvilDr
1
Fyi, si le GridViewest dans un UpdatePanelet qu'un async-postback est causé par un autre contrôle, l' OnRowDataBoundévénement ne sera pas déclenché, donc le code de cette réponse ne sera pas exécuté, ce qui entraînera le GridViewretour au rendu sans <thead>balises ... soupir . Pour cibler ce cas, poussez le code de la réponse acceptée dans le gestionnaire d' PreRenderévénements de gridView (un peu comme le suggère la réponse d'ASalvo ).
Mr.Z
C'est la bonne réponse, car elle utilise correctement le flux de travail WebForms.
Marcel
10
Le code dans la réponse doit continuer Page_Loadou GridView_PreRender. Je l'ai mis dans une méthode qui a été appelée après Page_Loadet j'ai obtenu un NullReferenceException.
Vous pouvez également mettre en DataBoundévénement. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM
4
Je ne sais pas si c'est différent dans .NET 4.5 maintenant ... mais j'obtiens que HeaderRow est nul dans les gestionnaires d'événements _DataBound et _PreRender. Cela peut être lié au fait que j'utilise la nouvelle fonctionnalité «Model Binding» de ASP.NET Web Forms dans le gridView.
ClearCloud8
7
J'utilise le code suivant pour ce faire:
Les ifdéclarations que j'ai ajoutées sont importantes.
Sinon (en fonction de la façon dont vous affichez votre grille), vous lancerez 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.
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);}
L' thisobjet 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.
Réponses:
Cela devrait le faire:
la source
HeaderRow
propriété seranull
jusqu'à ce que lesGridView
données soient liées, assurez-vous donc d'attendre que la liaison de données se soit produite avant d'exécuter la ligne de code ci-dessus.thead
est de l'utiliser dans jQuery. Cependant, après le rendu de l'en-tête, letbody
ne semble pas être disponible. Que manque-t-il dans mon cas?J'utilise ceci en
OnRowDataBound
cas:la source
GridView
est dans unUpdatePanel
et qu'un async-postback est causé par un autre contrôle, l'OnRowDataBound
événement ne sera pas déclenché, donc le code de cette réponse ne sera pas exécuté, ce qui entraînera leGridView
retour au rendu sans<thead>
balises ... soupir . Pour cibler ce cas, poussez le code de la réponse acceptée dans le gestionnaire d'PreRender
événements de gridView (un peu comme le suggère la réponse d'ASalvo ).Le code dans la réponse doit continuer
Page_Load
ouGridView_PreRender
. Je l'ai mis dans une méthode qui a été appelée aprèsPage_Load
et j'ai obtenu unNullReferenceException
.la source
DataBound
événement.grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
J'utilise le code suivant pour ce faire:
Les
if
déclarations que j'ai ajoutées sont importantes.Sinon (en fonction de la façon dont vous affichez votre grille), vous lancerez des exceptions comme:
L'
this
objet 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.
la source
Cela fonctionne pour moi:
Cela a été essayé dans VS2010.
la source
Je sais que c'est vieux, mais, voici une interprétation de la réponse de MikeTeeVee, pour une grille standard:
page aspx:
aspx.cs:
la source
Créez une fonction et utilisez cette fonction dans votre
PageLoad
événement comme ceci:La fonction est:
L'
PageLoad
événement est:la source
Vous pouvez également utiliser jQuery pour l'ajouter. Cela évite le problème avec TableRowSection.TableHeader où est déposé sur PostBack.
$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));
la source