Comment obtenir le GridView
contrôle pour rendre les <thead>
<tbody>
balises? Je sais .UseAccessibleHeaders
qu'il le met à la <th>
place de <td>
, mais je ne peux pas faire <thead>
apparaître le.
Comment obtenir le GridView
contrôle pour rendre les <thead>
<tbody>
balises? Je sais .UseAccessibleHeaders
qu'il le met à la <th>
place de <td>
, mais je ne peux pas faire <thead>
apparaître le.
Réponses:
Cela devrait le faire:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
propriété sera null
jusqu'à ce que les GridView
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, le tbody
ne semble pas être disponible. Que manque-t-il dans mon cas?
J'utilise ceci en OnRowDataBound
cas:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
est dans un UpdatePanel
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 le GridView
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
ou GridView_PreRender
. Je l'ai mis dans une méthode qui a été appelée après Page_Load
et j'ai obtenu un NullReferenceException
.
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:
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' 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.
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.
Je sais que c'est vieux, mais, voici une interprétation de la réponse de MikeTeeVee, pour une 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;
}
}
Créez une fonction et utilisez cette fonction dans votre PageLoad
événement comme ceci:
La fonction est:
private void MakeGridViewPrinterFriendly(GridView gridView) {
if (gridView.Rows.Count > 0) {
gridView.UseAccessibleHeader = true;
gridView.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}
L' PageLoad
événement est:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}