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


En C #, ¿cómo sigo mostrando los encabezados de una vista en cuadrícula, incluso con la fuente de datos vacía?

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

Actualmente, lo que estoy haciendo es lo siguiente.

Obtenga una DataTable de un procedimiento almacenado, luego configure DataSource de gridview y luego llame a DataBind ().

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

Editar: Gracias a todos por la propiedad .NET 4+. Le pregunté esto en .NET 3.5 días. Esto es mucho más fácil ahora. :)


73
2017-12-09 21:52


origen


Respuestas:


ASP.Net 4.0 agregó el booleano ShowHeaderWhenEmpty propiedad.

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 nulo.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()

119
2018-02-17 19:13



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
2017-12-09 21:59



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


5
2017-07-14 21:05



Si está trabajando con ASP.NET 3.5 y versiones anteriores, y su problema es relativamente simple como el mío, puede devolver una fila nula desde 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 # ni código ASP.NET

  1. Asegúrese de convertir las columnas nulas en nombres apropiados; de lo contrario, no funcionará.
  2. Se debe incluir otro bloque, 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 está mapeado a un cuadro DropDownList fuera de gridview.

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


3
2017-07-10 15:28



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

showheaderwhenEmpty Propiedad


3
2017-12-20 11:21



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

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


2
2017-12-09 22:07



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


1
2018-04-18 13:25



Encontré una solución muy simple al problema. Simplemente creé dos GridViews. El primer GridView llamó a un DataSource 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 coloque un GridView dentro de él con ShowHeader = "false" para que la fila superior tenga el mismo tamaño que todas las otras 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
2018-06-13 17:53



<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
2017-09-06 08:31