Como obtenho o GridView
controle para renderizar as <thead>
<tbody>
tags? Eu sei que .UseAccessibleHeaders
faz com que seja colocado em <th>
vez de <td>
, mas não consigo fazer o <thead>
aparecer.
Como obtenho o GridView
controle para renderizar as <thead>
<tbody>
tags? Eu sei que .UseAccessibleHeaders
faz com que seja colocado em <th>
vez de <td>
, mas não consigo fazer o <thead>
aparecer.
Respostas:
Isso deve servir:
gv.HeaderRow.TableSection = TableRowSection.TableHeader;
HeaderRow
propriedade será null
até que GridView
tenha sido vinculado aos dados, portanto, certifique-se de esperar até que a vinculação de dados ocorra antes de executar a linha de código acima.
thead
é usá-lo no jQuery. No entanto, após renderizar o cabeçalho, o tbody
parece não estar disponível. O que pode estar faltando no meu caso?
Eu uso isso no OnRowDataBound
evento:
protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
if (e.Row.RowType == DataControlRowType.Header) {
e.Row.TableSection = TableRowSection.TableHeader;
}
}
GridView
estiver dentro de um UpdatePanel
e um postback assíncrono for causado por algum outro controle, o OnRowDataBound
evento não será gerado, portanto, o código nesta resposta não será executado, resultando na GridView
reversão para renderização sem <thead>
tags ... suspiro . Para direcionar este caso, enfie o código da resposta aceita no PreRender
manipulador de eventos do gridView (bem como a resposta de ASalvo sugere).
O código na resposta precisa continuar Page_Load
ou GridView_PreRender
. Coloquei em um método que foi chamado depois Page_Load
e obtive um NullReferenceException
.
DataBound
evento. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
Eu uso o seguinte código para fazer isso:
As if
declarações que adicionei são importantes.
Caso contrário (dependendo de como você renderiza sua grade), você lançará exceções como:
A tabela deve conter seções de linha em ordem de cabeçalho, corpo e rodapé.
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);
}
O this
objeto é meu GridView.
Na verdade, eu substituí o Asp.net GridView para fazer meu próprio controle personalizado, mas você pode colar isso em sua página aspx.cs e fazer referência ao GridView pelo nome em vez de usar a abordagem custom-gridview.
FYI: Eu não testei a lógica do rodapé, mas sei que isso funciona para cabeçalhos.
Isso funciona para mim:
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;
}
}
Isso foi tentado no VS2010.
Eu sei que isso é antigo, mas aqui está uma interpretação da resposta de MikeTeeVee, para um gridview padrão:
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;
}
}
Crie uma função e use-a em seu PageLoad
evento como este:
A função é:
private void MakeGridViewPrinterFriendly(GridView gridView) {
if (gridView.Rows.Count > 0) {
gridView.UseAccessibleHeader = true;
gridView.HeaderRow.TableSection = TableRowSection.TableHeader;
}
}
O PageLoad
evento é:
protected void Page_Load(object sender, EventArgs e) {
if (!IsPostBack)
{
MakeGridViewPrinterFriendly(grddata);
}
}