2009-04-08 7 views
15

J'ai une application Web ASP.NET 2.0 (C#), et dans ce que j'ai un gridview qui obtient ses données à partir d'une base de données Oracle.Comment faire pour vérifier un Gridview vide

Je veux savoir comment vérifier si le gridview est vide, et le faire quelque chose.

J'ai déjà essayé:

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

mais il ne fonctionne pas ...

Toutes les idées?

Merci.

Répondre

22

Votre code devrait fonctionner. Mais seulement après que GridView.DataBind() a été appelé. Généralement, je ne vérifie pas le GridView, mais la source de données de la grille.

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

Si vous utilisez la liaison de données, le nombre de lignes de la source de données n'est pas le nombre sur la grille elle-même.

18

Cela ne fonctionne pas car GridView est lié aux données et va extraire les données réelles plus tard lors du rendu de la page. Vous devriez vérifier ceci en interrogeant directement la source de liaison de données de la vue de grille (voir si la liste réelle à laquelle la vue de grille est liée est vide ou non).

Si vous voulez juste pour afficher quelque chose quand il est vide, vous devez utiliser <EmptyDataTemplate> dans votre balisage:

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

+1 -le EmptyDataTemplate est la solution la plus élégante IMHO –

+3

+1 Vous pouvez également utiliser la propriété EmptyDataText –

6

Je suis d'accord avec les autres réponses. Je veux ajouter peu d'informations, vous devriez obtenir rows.count après la méthode DataBind:

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

GridView.DataBind(); 

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

Juste un peu plus d'informations: la grille affichera uniquement le nombre maximal de lignes pour la pagination si la pagination est activée. Donc, il est préférable de vérifier la source de données réelles –

+0

bon point, merci. – Canavar

+1

Salut @Canavar, je voulais juste savoir si GridView.DataBind(); est possible sans se lier à aucune source de données? –

0

Il est très facile: Espérons que cela fonctionne pour vous .. :)

Utilisation cas de GridView DataBound: qui se déclenche après les données sont liées.

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

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

} 
+0

Pas tout à fait. Row.Count inclut tous les en-têtes et pieds de page – Fandango68

0

Si vous avez configuré votre GV pour récupérer automatiquement les données de DB, vous pouvez ajouter la ligne suivante comme la première déclaration de votre GV en mode Source:

<EmptyDataTemplate>No data found.</EmptyDataTemplate> 

Et puis continuez avec le code normal dans votre GV.

1

Créez d'abord une classe d'assistance.

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

Ensuite, il suffit d'appeler EstVide

GridView1.IsEmpty() 
+0

Avez-vous une chance de réécrire ceci pour VS2005? – Fandango68

0

Sur la base des réponses déjà, GridView.Rows.Count ne suffit pas à elle seule, selon la nature de votre GridView, surtout si elle est un gv dynamique, qui, dans la plupart des cas il est, plus vous devez prendre en compte Paginating, en-têtes et pieds de page, qui modifient le nombre de lignes. J'utilise une méthode simple pour me dire ...

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

Il faut donc lancer quelque chose comme ça vous dira si les lignes sont vraiment " « lignes DATA », ou vide ou rien!

Il est évident que dans mon cas, j'ai HiddenField de me dire si le GridViewRow est une ligne de données réelles, comme je l'ai déjà remplis mon gridview avec des lignes vides (pour mes besoins) et quelques lignes de données.

Cependant, une version plus simple de vérifier basée sur DataRow vs HeaderRow, etc ...

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

J'espère que cela aide. En bref, il n'y a malheureusement pas de fonction GridView.IsEmpty(), à moins d'en énumérer une comme indiqué ci-dessous.

Questions connexes