2008-11-21 9 views
98

¿Cómo obtengo el control GridView para representar las etiquetas <thead><tbody>? Sé que .UseAccessibleHeaders lo pone <th> en lugar de <td>, pero no puedo obtener el <thead> para que aparezca.¿Cómo hago que Gridview renderice THEAD?

+0

FYI: UseAccessibleHeader es "verdadero" de forma predeterminada, por lo que no es necesario configurarlo. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.useaccessibleheader.aspx – MikeTeeVee

Respuesta

168

Esto debe hacerlo:

gv.HeaderRow.TableSection = TableRowSection.TableHeader; 
+64

La propiedad 'HeaderRow' será' null' hasta que 'GridView' haya sido enlazado a los datos, así que asegúrese de esperar hasta que se haya producido el enlace de datos antes de ejecutar la línea de código anterior. – bdukes

+4

Como comenta a continuación, con ASP.NET 4.5 al menos después de que el enlace no sea lo suficientemente tarde; sin embargo, funciona en OnPreRender. – philw

+0

Tengo una vista en cuadrícula con subcabeceras personalizadas agregadas. Cada uno de estos subcabecera muestra datos de la fuente de datos. La razón por la que quería renderizar 'thead' es usarlo en jQuery. Sin embargo, después de mostrar el encabezado, el 'tbody' no parece estar disponible. ¿Qué puede faltar en mi caso? – bonCodigo

9

El código en la respuesta tiene que ir en Page_Load o GridView_PreRender. Lo puse en un método que se llamó después de Page_Load y obtuve un NullReferenceException.

+4

También puede colocar el evento 'DataBound'. 'grid.DataBound + = (s, e) => {grid.HeaderRow.TableSection = TableRowSection.TableHeader; }; ' – BrunoLM

+4

No sé si esto es diferente en .NET 4.5 ahora ... pero estoy obteniendo que HeaderRow sea nulo en los controladores de eventos _DataBound y _PreRender. Esto podría estar relacionado con el hecho de que estoy utilizando la nueva función "Encuadernación de modelo" de ASP.NET Web Forms en gridView. – ClearCloud8

2

Cree una función y el uso de esa función en su caso PageLoad así:

La función es:

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

El evento PageLoad es:

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

utilizo el siguiente código para hacer esto:

ElLas declaracionesque agregué son importantes.

De lo contrario (en función de cómo se procesa la rejilla) que va a lanzar excepciones como:

La tabla debe contener secciones fila con el fin de cabecera, cuerpo y luego 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 objeto this es mi GridView.

De hecho, me pesaban más que las Asp.net GridView para hacer mi propio control personalizado, pero se puede pegar esto en sus aspx.cs página y hacer referencia al GridView por su nombre en lugar de utilizar el enfoque a medida gridview.

FYI: No he probado la lógica del pie de página, pero sé que esto funciona para los encabezados.

3

Esto funciona para mí:

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 fue juzgado en VS2010.

14

yo uso esto en OnRowDataBound evento:

if (e.Row.RowType == DataControlRowType.Header) 
    e.Row.TableSection = TableRowSection.TableHeader; 
+4

Esta es la única solución que funcionó para mí. ¿Quién diseñó estos terribles controles? – EKW

+0

Inserté su código en el evento OnRowCreated y lo puse a funcionar correctamente. – yougotiger

1

Sé que esto es viejo, pero, he aquí una interpretación de la respuesta de MikeTeeVee, para un gridview estándar:

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

    }