2009-04-08 16 views
15

Ho un'app Web ASP.NET 2.0 (C#), e in essa ho una griglia che ottiene i suoi dati da un database Oracle.Come controllare una Gridview vuota

Voglio sapere come verificare se il gridview è vuoto e il fare qualcosa.

ho già provato:

if(GridView.Rows.Count == 0) 
{ 
// Do Something 
} 

ma non funziona ...

Tutte le idee?

Grazie.

risposta

22

Il vostro lavoro codice dovrebbe. Ma solo dopo che GridView.DataBind() è stato chiamato. Generalmente non controllo il GridView da solo, ma l'origine dati della vista griglia.

DataTable data = DAL.getdata(); 
if (data.Rows.Count == 0) 
{ 
    ShowEmptyData(); 
} 
else 
{ 
    Grid.DataSource = dt; 
    Grid.DataBind(); 
} 
4

Se si utilizza l'associazione dati, il conteggio delle righe dell'origine dati non è il conteggio sulla griglia stessa.

18

Questo non funziona poiché GridView è associato a dati e sta recuperando i dati effettivi in ​​un secondo momento durante il rendering della pagina. È necessario verificare questo interrogando direttamente l'origine di associazione dei dati di gridview (vedere se l'elenco effettivo a cui è collegata la vista della griglia è vuoto o meno).

Se si desidera solo per visualizzare qualcosa quando è vuoto, è necessario utilizzare <EmptyDataTemplate> nel markup:

<asp:GridView runat="server"> 
<EmptyDataTemplate>The grid is empty</EmptyDataTemplate> 
</asp:GridView> 
+2

+1 -the EmptyDataTemplate è la soluzione più elegante IMHO –

+3

+1 È anche possibile utilizzare la proprietà EmptyDataText –

6

Sono d'accordo con le altre risposte. Voglio aggiungere poche informazioni, si dovrebbe ottenere rows.count dopo che il metodo DataBind:

int rowCount = GridView.Rows.Count; // returns zero 

GridView.DataBind(); 

rowCount = GridView.Rows.Count; // returns actual row count 
+1

Solo un po 'più di informazioni: il gridview mostrerà solo il numero massimo di righe per il paging se il paging è abilitato. Quindi è meglio controllare l'origine dati attuale –

+0

buon punto, grazie. – Canavar

+1

Salve @Canavar, volevo solo sapere se GridView.DataBind(); è possibile senza vincolare a qualsiasi origine dati? –

0

È molto facile: Spero che funziona per voi .. :)

Utilizzo caso di GridView DataBound: che spara dopo i dati sono vincolati.

protected void GridView1_DataBound(object sender, EventArgs e) 
{ 
    int rowCount = GridView1.Rows.Count; 

    if (rowCount == 0) 
    { 
     GridView1.Visible = false;     
    } 
    else 
    { 
     GridView1.Visible = true; 
    } 

} 
+0

Non proprio. Row.Count include eventuali intestazioni e piè di pagina – Fandango68

0

Nel caso in cui hai configurato il GV per recuperare automaticamente i dati da DB, allora si può aggiungere la seguente riga come la prima dichiarazione del GV in modalità Fonte:

<EmptyDataTemplate>No data found.</EmptyDataTemplate> 

E poi continua con il codice normale nel tuo GV.

1

Per prima cosa creare una classe di supporto.

public static class GridViewExtensions 
{ 
    public static IEnumerable<GridViewRow> AsEnumerable(this GridView grid) 
    { 
     foreach (GridViewRow row in grid.Rows) 
     { 
      yield return row; 
     } 
    } 

    public static bool IsEmpty(this GridView grid) 
    { 
     return !grid.AsEnumerable().Any(t => t.RowType == DataControlRowType.DataRow); 
    } 
} 

Poi basta chiamare IsEmpty

GridView1.IsEmpty() 
+0

Qualche possibilità che potresti riscrivere per VS2005? – Fandango68

0

Sulla base delle risposte già, GridView.Rows.Count non è sufficiente di per sé, a seconda della natura della vostra GridView, soprattutto se si tratta di un gv dinamica, che nella maggior parte dei casi lo è, in più devi calcolare Paginating, intestazioni e piè di pagina, che alterano il conteggio delle righe.

Io uso un metodo semplice per dirmi ...

//checks if a gridview has any actual rows of data (not just blank rows filled in by the Load 
protected bool gvNoData(GridView gv) 
{ 
    int wsDataRow = 0; 
    foreach (GridViewRow gvRow in gv.Rows) 
     if (gvRow.RowType == DataControlRowType.DataRow) 
     { 
      HiddenField hf = (HiddenField)gvRow.FindControl("hfStudentID"); 
      if (hf != null) 
       if (hf.Value.ToString().Length > 0) 
        wsDataRow +=1; 
     } 

    //if a count was generated then there are data rows, otherwise the rows are blank or nonexistant 
    if (wsDataRow > 0) return false; 
    else return true; 
} 

Così in esecuzione qualcosa come questo vi dirà se le righe sono davvero " 'righe di dati', o vuoto o niente!

Ovviamente nel mio caso ho un HiddenField per dirmi se il GridViewRow è una riga di dati reali, come ho precompilare il mio gridView con righe vuote (per i miei scopi) e alcuni DataRow.

Tuttavia, una versione più semplice per controllare sulla base di DataRow vs HeaderRow, ecc ...

 foreach (GridViewRow gvRow in myGridView.Rows) 
      if (gvRow.RowType == DataControlRowType.DataRow) 
      { 
//do what you need 
      } 

Spero che questo aiuti.

In breve, non esiste purtroppo la funzione GridView.IsEmpty(), a meno che non ne venga enumerata una come mostrato di seguito.

Problemi correlati