GridView - Mostrar cabeçalhos em fonte de dados vazio

votos
73

Em C # como faço para ainda mostrar os cabeçalhos de um gridview, mesmo com a fonte de dados está vazio.

Não estou auto gerando as colunas como todos eles são pré-definido.

Atualmente o que estou fazendo é o seguinte.

Obter um DataTable de volta a partir de um procedimento armazenado, em seguida, definir a origem de dados do gridview, e em seguida, chamar DataBind ().

Isso funciona bem quando eu tenho os dados, mas quando nenhuma linha é retornada então eu apenas conseguir um lugar em branco onde a grade deve ser.

Edit: Obrigado a todos para a propriedade .NET 4+. Eu perguntei isso de volta no .NET 3,5 dias. Isto é muito mais fácil agora. :)

Publicado 09/12/2008 em 22:52
fonte usuário
Em outras línguas...                            


16 respostas

votos
119

ASP.Net 4.0 adicionou o boolean ShowHeaderWhenEmptypropriedade.

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: os cabeçalhos não aparecerá a menos DataBind () é chamado com algo que não seja nulo.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()
Respondeu 17/02/2011 em 20:13
fonte usuário

votos
30

Depois de postar isso eu vim com uma forma que funciona. No entanto, eu não sinto que é a melhor maneira de lidar com isso. Todas as sugestões sobre um melhor?

//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;
}
Respondeu 09/12/2008 em 22:59
fonte usuário

votos
5

Eu estava trabalhando com este problema, e nenhuma dessas soluções iria trabalhar para mim. Eu não poderia usar a EmptyDataTemplatepropriedade, porque eu estava criando o meu GridViewdinamicamente com campos personalizados que fornecem filtros nos cabeçalhos. Eu não poderia usar o exemplo almny postou porque eu estou usando ObjectDataSources, em vez de DataSetou DataTable. No entanto, eu achei esta resposta postada em uma outra questão StackOverflow, que liga a esta solução elegante que eu era capaz de fazer o trabalho para a minha situação particular. Trata-se de substituir o CreateChildControlsmétodo da GridViewpara criar a mesma linha de cabeçalho que teria sido criado se tivesse havido dados reais. Eu pensei que vale a pena postar aqui, onde é provável de ser encontrado por outras pessoas em uma correção similar.

Respondeu 14/07/2009 em 22:05
fonte usuário

votos
3

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

showheaderwhenEmpty Propriedade

Respondeu 20/12/2012 em 12:21
fonte usuário

votos
3

Se você está trabalhando com ASP.NET 3.5 e inferior, e seu problema é relativamente simples como o meu, você pode simplesmente retornar uma linha nula a partir da 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 solução não requer qualquer código C # ou código ASP.NET

  1. Certifique-se de lançar as colunas nulos em nomes apropriados, caso contrário não vai funcionar.
  2. bloco else deve ser incluído que é a mesma consulta em if not exists (query part)
  3. No meu caso, se eu estou usando @RepID em vez de 10. Qual é mapeado para uma caixa de DropDownList fora gridview.

Cada vez que eu mudar o drop down para selecionar um representante diferente, Gridview é atualizado. Se nenhum registro for encontrado, ele mostra uma linha nulo.

Respondeu 10/07/2012 em 16:28
fonte usuário

votos
2

Você pode usar HeaderTemplate propriedade para configurar a cabeça programaticamente ou usar ListView em vez se você estiver usando o .NET 3.5.

Pessoalmente, eu prefiro ListView sobre GridView e DetailsView, se possível, dá-lhe mais controle sobre seu html.

Respondeu 09/12/2008 em 23:07
fonte usuário

votos
1

Você pode definir a propriedade ShowHeadersWhenNoRecords do ownertableview para true. aspx:

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

Além disso, quando a fonte de dados para o GridView é nulo (quando há registros), você pode tentar defini-lo como mostrado abaixo: c #:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
Respondeu 29/06/2016 em 10:24
fonte usuário

votos
1

Juste adicionar ShowHeaderWhenEmpty propriedade e ajustá-la em verdade

Esta solução funciona para mim

Respondeu 27/02/2015 em 15:23
fonte usuário

votos
1
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

Este é um exemplo de base de Gridview com EmptyDataText e ShowHeaderWhenEmpty

Respondeu 06/09/2013 em 09:31
fonte usuário

votos
1

Eu encontrei uma solução muito simples para o problema. Eu simplesmente criou duas GridViews. O primeiro GridView chamada DataSource com uma consulta que foi projetado para retornar nenhuma linha. Ele simplesmente continha o seguinte:

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

Então eu criei uma div com as seguintes características e eu colocar um GridView dentro dele com ShowHeader = "false" para que a linha superior é do mesmo tamanho que todas as outras linhas.

<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>
Respondeu 13/06/2012 em 18:53
fonte usuário

votos
1

Adicionar essa propriedade para sua grade-view: ShowHeaderWhenEmpty = "True" Pode ajudar basta verificar

Respondeu 18/04/2012 em 14:25
fonte usuário

votos
0

Eu estava usando asp SQLDataSource. Ela trabalhou para mim quando eu definir o CancelSelectOnNullParameter para false como abaixo:

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

Respondeu 24/01/2018 em 17:32
fonte usuário

votos
-1
    <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/
Respondeu 08/07/2015 em 08:47
fonte usuário

votos
-1
<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();  
Respondeu 08/07/2015 em 08:43
fonte usuário

votos
-1

Você pode usar EmptyDataTextcomo mostrado abaixo:

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

Ele não mostra cabeçalhos, torna a sua mensagem "Nenhuma entrada encontrada." em vez de.

Respondeu 21/09/2012 em 18:40
fonte usuário

votos
-3

Use um EmptyDataTemplate como abaixo. Quando seu DataSource não tem registros, você vai ver a sua grade com cabeçalhos, eo texto literal ou HTML que está dentro das tags 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>
Respondeu 09/12/2008 em 23:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more