c# - llenar - ¿Cómo hago que Gridview renderice THEAD?
gridview asp.net c# sql server (7)
¿Cómo obtengo el control GridView
para representar las <thead>
<tbody>
? Sé .UseAccessibleHeaders
lo pone <th>
lugar de <td>
, pero no puedo hacer que <thead>
.
Cree una función y use esa función en su evento PageLoad
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 evento PageLoad
es:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}
El código en la respuesta debe continuar en Page_Load
o GridView_PreRender
. Lo puse en un método que se llamó después de Page_Load
y obtuve una NullReferenceException
.
Esto debería hacerlo:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
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 probado en VS2010.
Sé que esto es viejo, 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;
}
}
Yo uso el siguiente código para hacer esto:
Las declaraciones if
que agregué son importantes.
De lo contrario (dependiendo de cómo represente su cuadrícula) arrojará excepciones como:
La tabla debe contener secciones de fila 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, superé Asp.net GridView para hacer mi propio control personalizado, pero podría pegarlo en su página aspx.cs y hacer referencia al GridView por nombre en lugar de usar el enfoque de gridview personalizado.
FYI: No he probado la lógica del pie de página, pero sí sé que esto funciona para los encabezados.
Yo uso esto en el evento OnRowDataBound
:
if (e.Row.RowType == DataControlRowType.Header)
e.Row.TableSection = TableRowSection.TableHeader;