GridView-Mostrar encabezados en una fuente de datos vacía


En C# cómo sigo mostrando las cabeceras de un gridview, incluso con la fuente de datos vacía.

No estoy generando automáticamente las columnas, ya que todas están predefinidas.

Actualmente lo que estoy haciendo es lo siguiente.

Obtiene una DataTable de un procedimiento almacenado, luego establece la fuente de datos de gridview y luego llama a DataBind().

Esto funciona bien cuando tengo datos, pero cuando no se devuelven filas, solo obtengo un punto en blanco donde la cuadrícula debería ser.

Edición: Gracias a todos por la propiedad. NET 4+. Pregunté esto en el. NET 3.5 días. Esto es mucho más fácil ahora. :)

Author: Joshua Hudson, 2008-12-10

16 answers

ASP.Net 4.0 se ha añadido la propiedad booleana ShowHeaderWhenEmpty.

Http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.gridview.showheaderwhenempty.aspx


<asp:GridView runat="server" ID="GridView1" ShowHeaderWhenEmpty="true" AutoGenerateColumns="false">
    <Columns>
        <asp:BoundField HeaderText="First Name" DataField="FirstName" />
        <asp:BoundField HeaderText="Last Name" DataField="LastName" />
    </Columns>
</asp:GridView>

Nota: los encabezados no aparecerán a menos que se llame a DataBind() con algo que no sea null.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()
 121
Author: zacharydl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-11 22:01:59

Después de publicar esto, se me ocurrió una forma que funciona. Sin embargo, no creo que sea la mejor manera de manejar esto. ¿Alguna sugerencia sobre una mejor?

//Check to see if we get rows back, if we do just bind.

if (dtFunding.Rows.Count != 0)
{
    grdFunding.DataSource = dtFunding;
    grdFunding.DataBind();
}
else
{
  //Other wise add a emtpy "New Row" to the datatable and then hide it after binding.

     dtFunding.Rows.Add(dtFunding.NewRow());
     grdFunding.DataSource = dtFunding;
     grdFunding.DataBind();
     grdFunding.Rows[0].Visible = false;
}
 31
Author: Joshua Hudson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 22:05:21

Yo estaba trabajando a través de este problema, y ninguna de estas soluciones funcionaría para mí. No pude usar la propiedad EmptyDataTemplate porque estaba creando mi GridView dinámicamente con campos personalizados que proporcionan filtros en los encabezados. No pude usar el ejemplo almny publicado porque estoy usando ObjectDataSource s en lugar de DataSet o DataTable. Sin embargo, encontré esta respuesta publicada en otra pregunta de StackOverflow, que enlaza con esta elegante solución que pude hacer funcionar para mi situación particular. Implica sobreescribir el método CreateChildControls del GridView para crear la misma fila de encabezado que se habría creado si hubiera habido datos reales. Pensé que valía la pena publicarlo aquí, donde es probable que lo encuentren otras personas en una solución similar.

 5
Author: StriplingWarrior,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 20:02:23

Si está trabajando con ASP.NET 3.5 y anteriores, y su problema es relativamente simple como el mío, solo puede devolver una fila nula de la consulta SQL.

if not exists (select RepId, startdate,enddate from RepTable where RepID= 10)
     select null RepID,null StartDate,null EndDate
else
     select RepId, startdate,enddate from RepTable where RepID= 10

Esta solución no requiere ningún código C # o ASP.NET código

  1. Asegúrese de convertir las columnas null en los nombres apropiados, de lo contrario no funcionará.
  2. Se debe incluir el bloque Else que es la misma consulta que en if not exists (query part)
  3. En mi caso si estoy usando @RepID en lugar de 10. Que se asigna a una Cuadro de lista desplegable fuera de gridview.

Cada vez que cambio el menú desplegable para seleccionar un representante diferente, Gridview se actualiza. Si no se encuentra ningún registro, muestra una fila nula.

 3
Author: Hammad Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-10 15:28:32

Set "<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""

showheaderwhenEmpty Propiedad

 3
Author: vikram Jangra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-20 11:39:07

Puede usar la propiedad HeaderTemplate para configurar el head programáticamente o usar ListView en su lugar si está utilizando.NET 3.5.

Personalmente, prefiero ListView sobre GridView y DetailsView si es posible, le da más control sobre su html.

 2
Author: Liwen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 22:21:51

Agregue esta propiedad a su vista de cuadrícula: ShowHeaderWhenEmpty = " True" podría ayudar simplemente comprobar

 1
Author: tariq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-18 13:25:42

Encontré una solución muy simple al problema. Simplemente creé dos GridViews. El primer GridView llamó a una fuente de datos con una consulta que fue diseñada para no devolver filas. Simplemente contenía lo siguiente:

    <Columns>
        <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
            <HeaderTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

            </HeaderTemplate>
        </asp:TemplateField>
    </Columns>

Luego creé un div con las siguientes características y coloco un GridView dentro de él con ShowHeader="false" para que la fila superior tenga el mismo tamaño que todas las demás filas.

<div style="overflow: auto; height: 29.5em; width: 100%">
    <asp:GridView ID="Rollup" runat="server" ShowHeader="false" DataSourceID="ObjectDataSource">
        <Columns>
            <asp:TemplateField HeaderStyle-HorizontalAlign="Left">
                <ItemTemplate>

               <asp:Label ID="lbl0" etc.>  </asp:Label>
               <asp:Label ID="lbl1" etc.>  </asp:Label>

                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
</div>
 1
Author: anegin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-13 17:53:30
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

Este es un ejemplo básico de Gridview con EmptyDataText y ShowHeaderWhenEmpty

 1
Author: user2753577,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-06 08:54:16

Simplemente agregue la propiedad ShowHeaderWhenEmpty y establézcala en true

Esta solución funciona para mí

 1
Author: onlyme,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-27 15:23:48

Puede establecer la propiedad ShowHeadersWhenNoRecords de ownertableview en true. aspx:

<asp:GridView ID="RadGrid2" runat="server" >       
<MasterTableView ShowHeadersWhenNoRecords="true"  > 

También cuando el datasource para GridView es null (cuando no hay registros), puede intentar configurarlo como se muestra a continuación: c#:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
 1
Author: kez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 10:24:45

Estaba usando asp SqlDataSource. Funcionó para mí cuando configuré el CancelSelectOnNullParameter en false como se muestra a continuación:

<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>

 0
Author: Md Toufiqul Islam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-24 17:32:27

Puede usar EmptyDataText como se muestra a continuación:

<asp:GridView ID="_gridView" RunAt="server" AutoGenerateColumns="false"
          EmptyDataText="No entries found.">

No muestra encabezados, muestra su mensaje "No se han encontrado entradas."en su lugar.

 -1
Author: Dmitriy Pichugin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-22 08:00:17
<asp:GridView ID="gvEmployee" runat="server"    
                 AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                    <Columns>  
                        <asp:BoundField DataField="Id" HeaderText="Id" />  
                        <asp:BoundField DataField="Name" HeaderText="Name" />  
                        <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                        <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                    </Columns>  
                    <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                </asp:GridView>  


in CS Page

gvEmployee.DataSource = dt;  
gvEmployee.DataBind();  
 -1
Author: Sureshkumar T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 08:43:44
    <asp:GridView ID="gvEmployee" runat="server"    
                     AutoGenerateColumns="False" ShowHeaderWhenEmpty=”True”>  
                        <Columns>  
                            <asp:BoundField DataField="Id" HeaderText="Id" />  
                            <asp:BoundField DataField="Name" HeaderText="Name" />  
                            <asp:BoundField DataField="Designation" HeaderText="Designation" />  
                            <asp:BoundField DataField="Salary" HeaderText="Salary"  />  
                        </Columns>  
                        <EmptyDataTemplate>No Record Available</EmptyDataTemplate>  
                    </asp:GridView>  


    in CS Page

    gvEmployee.DataSource = dt;  
    gvEmployee.DataBind();  

Help.. see that link:
http://www.c-sharpcorner.com/UploadFile/d0e913/how-to-display-the-empty-gridview-in-case-of-no-records-in-d/
 -1
Author: Suresh klt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-08 08:47:21

Utilice un EmptyDataTemplate como abajo. Cuando su fuente de datos no tiene registros, verá su cuadrícula con encabezados y el texto literal o HTML que está dentro de las etiquetas EmptyDataTemplate.

<asp:GridView ID="gvResults" AutoGenerateColumns="False" HeaderStyle-CssClass="tableheader" runat="server">
    <EmptyDataTemplate>
        <asp:Label ID="lblEmptySearch" runat="server">No Results Found</asp:Label>
    </EmptyDataTemplate>
    <Columns>
        <asp:BoundField DataField="ItemId" HeaderText="ID" />
        <asp:BoundField DataField="Description" HeaderText="Description" />
        ...
    </Columns>
</asp:GridView>
 -3
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 22:34:04