web-dev-qa-db-fra.com

Comment vérifier si un Gridview est vide

J'ai une application Web ASP.NET 2.0 (C #) et une grille d'affichage qui extrait ses données d'une base de données Oracle.

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 ça ne marche pas ...

Des idées?

Je vous remercie.

15
zohair

Votre code devrait fonctionne. Mais seulement après que GridView.DataBind () a été appelé. En général, je ne vérifie pas le GridView, mais la source de données de la vue en grille.

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

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

Si vous souhaitez simplement afficher quelque chose lorsqu'il est vide, vous devez utiliser <EmptyDataTemplate> dans votre balisage:

<asp:GridView runat="server">
<EmptyDataTemplate>The grid is empty</EmptyDataTemplate>
</asp:GridView>
18
Mehrdad Afshari

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
8
Canavar

Si vous utilisez la liaison de données, le nombre de lignes de la source de données ne correspond pas à celui de la grille.

4
Justin Niessner

Commencez par créer 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 IsEmpty

GridView1.IsEmpty()
1
nerdybeardo

Si vous avez configuré votre GV pour extraire automatiquement les données de la base de données, vous pouvez ajouter la ligne suivante comme première instruction de votre GV en mode source:

<EmptyDataTemplate>No data found.</EmptyDataTemplate>

Et continuez ensuite avec le code normal dans votre GV.

0
olleh

C'est très facile: espérons que cela fonctionne pour vous .. :)

Utilisez l'événement de GridView DataBound: qui se déclenche une fois les données 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
Aki

Déjà basé sur les réponses, GridView.Rows.Count ne suffit pas, en fonction de la nature de votre GridViewname__, en particulier s'il s'agit d'un gv dynamique, ce qui est le cas dans la plupart des cas, vous devez également prendre en compte Paginatingname__, Headers and Footers 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;
}

Donc, exécuter quelque chose comme ceci vous dira si les rangées sont vraiment des rangées "", Ou vides ou rien!

Évidemment, dans mon cas, j'ai un objet HiddenField pour me dire si GridViewRow est une ligne de données réelle, car je préremplit mon gridview de lignes vides (pour mes besoins) et de quelques datarows.

Cependant, une version plus simple à 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 ça aide.

En bref, il n’existe malheureusement pas de fonction GridView.IsEmpty (), à moins d’en énumérer une comme indiqué ci-dessous.

0
Fandango68