¿Cómo obtengo el GridView
control para representar las <thead>
<tbody>
etiquetas? Sé .UseAccessibleHeaders
que lo hace en <th>
lugar de hacerlo <td>
, pero no puedo hacer <thead>
que aparezca.
¿Cómo obtengo el GridView
control para representar las <thead>
<tbody>
etiquetas? Sé .UseAccessibleHeaders
que lo hace en <th>
lugar de hacerlo <td>
, pero no puedo hacer <thead>
que aparezca.
Respuestas:
Esto debería hacerlo:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
propiedad será null
hasta que GridView
se hayan vinculado los datos, así que asegúrese de esperar hasta que se haya producido la vinculación de datos antes de ejecutar la línea de código anterior.
thead
es para usarlo en jQuery. Sin embargo, después de renderizar el encabezado, tbody
no parece estar disponible. ¿Qué puede faltar en mi caso?
Yo uso esto en OnRowDataBound
caso de:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
está dentro de una UpdatePanel
y una devolución de datos asíncrona es causada por algún otro control, entonces el OnRowDataBound
evento no se generará, por lo que el código en esta respuesta no se ejecutará, lo que dará como resultado que se GridView
vuelva a renderizar sin <thead>
etiquetas ... suspiro . Para apuntar a este caso, introduzca el código de la respuesta aceptada en el controlador de PreRender
eventos de gridView (como sugiere la respuesta de ASalvo ).
El código de la respuesta debe continuar Page_Load
o GridView_PreRender
. Lo puse en un método que se llamó después Page_Load
y obtuve un NullReferenceException
.
DataBound
evento. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
Utilizo el siguiente código para hacer esto:
Las if
declaraciones que agregué son importantes.
De lo contrario (dependiendo de cómo renderice su cuadrícula) lanzará excepciones como:
La tabla debe contener secciones de filas en orden de encabezado, cuerpo y pie de página.
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);
}
El this
objeto es mi GridView.
De hecho, anulé Asp.net GridView para hacer mi propio control personalizado, pero puede pegar esto en su página aspx.cs y hacer referencia a GridView por nombre en lugar de usar el enfoque de vista de cuadrícula personalizada.
FYI: No he probado la lógica del pie de página, pero sé que esto funciona para los encabezados.
Esto funciona para mi:
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;
}
}
Esto se probó en VS2010.
Cree una función y use esa función en su PageLoad
evento de esta manera:
La función es:
private void MakeGridViewPrinterFriendly(GridView gridView) {
if (gridView.Rows.Count > 0) {
gridView.UseAccessibleHeader = true;
gridView.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}
El PageLoad
evento es:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}
Sé que esto es antiguo, pero aquí hay una interpretación de la respuesta de MikeTeeVee, para una vista de cuadrícula estándar:
página 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;
}
}