Come ottengo Gridview per il rendering di THEAD?


Risposte:


187

Questo dovrebbe farlo:

gv.HeaderRow.TableSection = TableRowSection.TableHeader;

69
La HeaderRowproprietà rimarrà nullfino a quando non GridViewè stato associato ai dati, quindi assicurati di attendere fino a quando non si è verificato l'associazione dei dati prima di eseguire la riga di codice precedente.
bdukes

6
Come commento di seguito, con ASP.NET 4.5 almeno dopo l'associazione non è abbastanza tardivo, tuttavia funziona in OnPreRender.
philw

Ho un gridview con sottotitoli personalizzati aggiunti. Ciascuna di queste intestazioni secondarie mostra i dati dall'origine dati. Il motivo per cui volevo renderizzare theadè usarlo in jQuery. Tuttavia, dopo il rendering dell'intestazione, il tbodynon sembra essere disponibile. Cosa potrebbe mancare nel mio caso?
bonCodigo

1
Ho scoperto che c'erano ancora problemi durante il postback e ho inserito il codice nell'evento databound che ha affrontato tutti gli scenari.
James Westgate

Porto i miei dati da un database quando l'utente fa clic su un pulsante. In tal caso, al gridview manca il tag thead. Qualsiasi aiuto?
touinta

25

Lo uso in OnRowDataBoundcaso:

protected void GridViewResults_OnRowDataBound(object sender, GridViewRowEventArgs e) {
    if (e.Row.RowType == DataControlRowType.Header) {
        e.Row.TableSection = TableRowSection.TableHeader;
    }
}

7
Questa è l'unica soluzione che ha funzionato per me. Chi ha progettato questi terribili controlli?
EKW

2
Ho inserito il tuo codice nell'evento OnRowCreated e l'ho fatto funzionare correttamente.
yougotiger

Questa è la soluzione migliore perché rimuove il rischio (e il controllo richiesto) che TableSection sia nullo se non ci sono righe all'interno di DataSource.
EvilDr

1
Cordiali saluti, se GridViewè all'interno di un UpdatePanele un postback asincrono è causato da qualche altro controllo, l' OnRowDataBoundevento non verrà generato, quindi il codice in questa risposta non verrà eseguito, con il risultato di GridViewtornare al rendering senza <thead>tag ... sigh . Per indirizzare questo caso, sposta il codice dalla risposta accettata nel gestore di PreRendereventi di gridView (proprio come suggerisce la risposta di ASalvo ).
Mr.Z

Questa è la risposta corretta, poiché utilizza correttamente il flusso di lavoro WebForms.
Marcel

10

Il codice nella risposta deve andare su Page_Loado GridView_PreRender. L'ho inserito in un metodo chiamato dopo Page_Loade ho ottenuto un file NullReferenceException.


4
Puoi anche mettere in DataBoundevent. grid.DataBound += (s, e) => { grid.HeaderRow.TableSection = TableRowSection.TableHeader; };
BrunoLM

4
Non so se questo sia diverso in .NET 4.5 ora ... ma sto ottenendo che HeaderRow è nullo in entrambi i gestori di eventi _DataBound e _PreRender. Ciò potrebbe essere correlato al fatto che sto utilizzando la nuova funzionalità "Associazione modelli" di ASP.NET Web Form in GridView.
ClearCloud8

7

Uso il seguente codice per farlo:

Le ifaffermazioni che ho aggiunto sono importanti.

Altrimenti (a seconda di come renderizzi la tua griglia) genererai eccezioni come:

La tabella deve contenere sezioni di riga in ordine di intestazione, corpo e piè di pagina.

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' thisoggetto è il mio GridView.

In realtà ho sovrascritto Asp.net GridView per creare il mio controllo personalizzato, ma puoi incollarlo nella tua pagina aspx.cs e fare riferimento a GridView per nome invece di utilizzare l'approccio personalizzato-gridview.

FYI: non ho testato la logica del piè di pagina, ma so che funziona per le intestazioni.


5

Questo funziona per me:

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

Questo è stato provato in VS2010.


2

Crea una funzione e usa quella funzione nel tuo PageLoadevento in questo modo:

La funzione è:

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

L' PageLoadevento è:

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

1

So che questo è vecchio, ma ecco un'interpretazione della risposta di MikeTeeVee, per una visualizzazione griglia standard:

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

    }

0

Puoi anche usare jQuery per aggiungerlo. Ciò evita il problema con TableRowSection.TableHeader dove viene rilasciato su PostBack.

$('#myTableId').prepend($("<thead></thead>").append($(this).find("#myTableId tr:first")));

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.