2009-04-08 17 views
15

tengo un ASP.NET 2.0 aplicación web (C#), y en ella tengo un gridview que obtiene sus datos desde una base de datos Oracle.Cómo comprobar si hay un vacío Gridview

Quiero saber cómo comprobar si el gridview está vacía, y el hacer algo.

Ya he probado:

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

pero no funciona ...

¿Alguna idea?

Gracias.

Respuesta

22

Su trabajo código debe . Pero solo después de haber llamado a GridView.DataBind(). En general, no reviso el GridView en sí mismo, sino el origen de datos de la vista de cuadrícula.

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

Si utiliza el enlace de datos, el recuento de la fila de la fuente de datos no es el recuento en la propia red.

18

Esto no funciona ya que el GridView está enlazado a datos y se va a recuperar los datos reales en un momento posterior al intentar mostrar la página. Usted debe revisar esta al consultar directamente la fuente del gridview enlace de datos (ver si la lista real de que la vista de cuadrícula con destino a está vacío o no).

Si lo que desea es mostrar algo cuando está vacío, se debe utilizar <EmptyDataTemplate> en su margen de beneficio:

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

+1-EmptyDataTemplate es la solución más elegante IMHO –

+3

+1 También puede usar la propiedad EmptyDataText –

6

Acepto las otras respuestas. Quiero añadir poca información, usted debe conseguir rows.count después método databind:

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

GridView.DataBind(); 

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

Solo un poco más de información: la vista de cuadrícula mostrará solo el número máximo de filas para la búsqueda si la búsqueda está habilitada. Por lo tanto, es mejor verificar el datasource real –

+0

buen punto, gracias. – Canavar

+1

Hola @Canavar, solo quería saber si GridView.DataBind(); es posible sin vincular a ninguna fuente de datos? –

0

Es muy fácil: Espero que funcione para usted .. :)

Uso caso de GridView DataBound: que dispara después de los datos están vinculados.

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

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

} 
+0

No del todo. Row.Count incluye cualquier encabezado y pie de página – Fandango68

0

En caso de que haya configurado el GV que recupere automáticamente los datos de DB, entonces puede añadir la siguiente línea que la primera declaración de la GV en el modo Fuente:

<EmptyDataTemplate>No data found.</EmptyDataTemplate> 

Y luego continúa con el código normal en tu GV.

1

Primero crea una clase de ayuda.

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

A continuación, sólo llamar IsEmpty

GridView1.IsEmpty() 
+0

¿Alguna posibilidad de que pueda reescribir esto para VS2005? – Fandango68

0

Sobre la base de las respuestas ya, GridView.Rows.Count no es suficiente por sí solo, dependiendo de la naturaleza de su GridView, especialmente si se trata de un gv dinámico, que en la mayoría de los casos es, además, tiene que tener en cuenta Paginating, encabezados y pies de página, que alteran el recuento de filas.

Utilizo un método simple para decirme ...

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

Entonces, ejecutar algo como esto le dirá si las filas son realmente " 'filas de datos', o vacío o nada!

Obviamente en mi caso tengo un HiddenField decirme si el GridViewRow es una fila de datos reales, ya que el llenado previo del gridview con mi filas en blanco (para mis propósitos) y algunos datarows.

Sin embargo, una versión más simple de comprobación basándose en DataRow vs HeaderRow, etc ...

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

Espero que esto ayude.

En resumen, no hay una función GridView.IsEmpty() desafortunadamente, a menos que enumere una como se muestra a continuación.

Cuestiones relacionadas