GridView - afficher les en-têtes sur la source de données vide

En C# comment puis-je toujours afficher les en-têtes d'un gridview, même avec la source de données est vide.

Je ne générerai pas automatiquement les colonnes car elles sont toutes prédéfinies.

ce que je fais actuellement est le suivant.

récupérez un DataTable d'une procédure stockée, puis définissez la source de données du gridview, puis appelez DataBind().

cela fonctionne très bien quand j'ai des données, mais quand aucune ligne n'est de retour alors je reçois juste un endroit blanc où la grille devrait être.

Edit: Merci à tous pour le .NET 4+ propriété. Je l'ai demandé dans le .NET 3,5 jours. C'est beaucoup plus facile maintenant. :)

74
demandé sur Joshua Hudson 2008-12-10 00:52:20

16 réponses

ASP.Net 4.0 Ajout de la propriété booléenne 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>

Note: les en-têtes n'apparaissent que si DataBind() est appelé avec quelque chose d'autre que null.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()
121
répondu zacharydl 2014-08-11 22:01:59

après avoir posté ceci, j'ai trouvé un moyen qui fonctionne. Cependant, je ne pense pas que ce soit la meilleure façon de gérer cela. Toutes les suggestions sur une meilleure?

//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
répondu Joshua Hudson 2008-12-09 22:05:21

je travaillais juste à travers ce problème, et aucune de ces solutions ne fonctionnerait pour moi. Je ne pouvais pas utiliser la propriété EmptyDataTemplate parce que je créais mon GridView dynamiquement avec des champs personnalisés qui fournissent des filtres dans les en-têtes. Je ne pouvais pas utiliser l'exemple d'almny posté parce que j'utilise ObjectDataSource s au lieu de DataSet ou DataTable . Cependant, j'ai trouvé cette réponse posté sur une autre question de débordement des piles, qui se lie à cette solution élégante que j'ai pu faire travailler pour ma situation particulière. Il s'agit de passer outre la méthode CreateChildControls du GridView pour créer la même ligne d'en-tête qui aurait été créée s'il y avait eu des données réelles. J'ai pensé qu'il vaut la peine de poster ici, où il est susceptible d'être trouvé par d'autres personnes dans un correctif similaire.

5
répondu StriplingWarrior 2018-02-22 20:02:23

si vous travaillez avec ASP.NET 3.5 et plus bas, et votre problème est relativement simple comme le mien, vous pouvez simplement retourner une ligne nulle de la requête 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

cette solution ne nécessite pas de code C ou ASP.NET code

  1. assurez-vous de mouler les colonnes nulles dans des noms appropriés, sinon ça ne marchera pas.
  2. autre bloc doit être inclus qui est la même requête que dans if not exists (query part)
  3. dans mon cas si j'utilise @RepID au lieu de 10. Qui est mappé à une boîte de DropDownList en dehors de gridview.

chaque fois que je clique sur le menu déroulant pour sélectionner un rep différent, Gridview est mis à jour. Si aucun enregistrement n'est trouvé, il affiche une ligne nulle.

3
répondu Hammad Khan 2012-07-10 15:28:32

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

showheaderwhenEmpty biens

3
répondu vikram Jangra 2012-12-20 11:39:07

vous pouvez utiliser la propriété HeaderTemplate pour configurer head programatically ou utiliser ListView à la place si vous utilisez .NET 3.5.

personnellement, je préfère ListView à GridView et DetailsView si possible, cela vous donne plus de contrôle sur votre html.

2
répondu Liwen 2008-12-09 22:21:51

Ajoutez cette propriété à votre vue de grille: ShowHeaderWhenEmpty= " True" il pourrait aider juste vérifier

1
répondu tariq 2012-04-18 13:25:42

j'ai trouvé une solution très simple au problème. J'ai simplement créé deux GridViews. Le premier GridView a appelé une source de données avec une requête qui a été conçue pour retourner aucune ligne. Il contenait simplement ce qui suit:

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

puis j'ai créé une div avec les caractéristiques suivantes et je place un GridView à l'intérieur de celui-ci avec ShowHeader=" false " de sorte que la rangée du haut est la même taille que toutes les autres rangées.

<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
répondu anegin 2012-06-13 17:53:30
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

C'est un exemple de base de Gridview avec EmptyDataText et ShowHeaderWhenEmpty

1
répondu user2753577 2013-09-06 08:54:16

Juste ajouter ShowHeaderWhenEmpty propriété et le mettre à true

Cette solution fonctionne pour moi

1
répondu onlyme 2015-02-27 15:23:48

vous pouvez définir la propriété ShowHeadersWhenNoRecords de ownertableview à true. aspx:

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

aussi quand la source de données pour GridView est nulle (quand aucun enregistrement), vous pouvez essayer de la définir comme indiqué ci-dessous: c#:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();
1
répondu kez 2016-06-29 10:24:45

j'utilisais asp sqlDataSource. Cela a fonctionné pour moi quand j'ai mis le paramètre Cancelselectonnull à false comme ci-dessous:

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

0
répondu Md Toufiqul Islam 2018-01-24 17:32:27

vous pouvez utiliser EmptyDataText comme indiqué ci-dessous:

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

il n'affiche pas les en-têtes, il affiche votre message" Aucune entrée trouvée." plutôt.

-1
répondu Dmitriy Pichugin 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
répondu Sureshkumar T 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
répondu Suresh klt 2015-07-08 08:47:21

utilisez un EmptyDataTemplate comme ci-dessous. Lorsque votre source de données n'a pas d'enregistrement, vous verrez votre grille avec les en-têtes, et le texte littéral ou HTML qui est à l'intérieur des balises Emptydatemplate.

<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
répondu 2008-12-09 22:34:04