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. :)
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()
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;
}
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.
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
- assurez-vous de mouler les colonnes nulles dans des noms appropriés, sinon ça ne marchera pas.
- autre bloc doit être inclus qui est la même requête que dans
if not exists (query part)
- 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.
set "<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
showheaderwhenEmpty
biens
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.
Ajoutez cette propriété à votre vue de grille: ShowHeaderWhenEmpty= " True" il pourrait aider juste vérifier
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>
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">
C'est un exemple de base de Gridview avec EmptyDataText et ShowHeaderWhenEmpty
Juste ajouter ShowHeaderWhenEmpty propriété et le mettre à true
Cette solution fonctionne pour moi
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();
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>
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.
<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();
<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/
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>