En C #, comment puis-je toujours afficher les en-têtes d'un gridview, même si la source de données est vide?
Je ne génère pas automatiquement les colonnes car elles sont toutes prédéfinies.
Actuellement, ce que je fais est le suivant.
Récupère un DataTable à partir d'une procédure stockée, définit le DataSource du gridview, puis appelle DataBind ().
Cela fonctionne bien lorsque j'ai des données, mais lorsqu'aucune ligne n'est renvoyée, j'obtiens juste un espace vide à l'emplacement de la grille.
Edit: Merci à tous pour la propriété .NET 4+. Je l'ai demandé dans les 3.5 jours .NET. C'est beaucoup plus facile maintenant. :)
ASP.Net 4.0 a ajouté 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>
Remarque: les en-têtes n'apparaîtront que si DataBind () est appelé avec autre chose que null.
GridView1.DataSource = New List(Of String)
GridView1.DataBind()
Après avoir posté cela, j'ai trouvé un moyen qui fonctionne. Cependant, je ne pense pas que ce soit la meilleure façon de gérer cela. Des suggestions sur un meilleur?
//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 simplement sur ce problème et aucune de ces solutions ne fonctionnerait pour moi. Je ne pouvais pas utiliser la propriété EmptyDataTemplate
car je créais ma GridView
de manière dynamique avec des champs personnalisés qui fournissent des filtres dans les en-têtes. Je ne pouvais pas utiliser l'exemple affiché par almny car j'utilise ObjectDataSource
s au lieu de DataSet
ou DataTable
. Cependant, j'ai trouvé cette réponse postée sur une autre question de StackOverflow, qui renvoie à cette solution élégante que j'ai pu travailler pour ma situation particulière. Cela implique de remplacer la méthode CreateChildControls
de la 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. Je pensais que cela valait la peine de poster ici, où il est susceptible d'être trouvé par d'autres personnes dans un correctif similaire.
set "<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
showheaderwhenEmpty
Propriété
Si vous travaillez avec ASP.NET 3.5 ou version antérieure et que votre problème est relativement simple, vous pouvez simplement renvoyer une ligne null à partir 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 aucun code C # ou ASP.NET
if not exists (query part)
Chaque fois que je modifie le menu déroulant pour sélectionner un représentant différent, Gridview est mis à jour. Si aucun enregistrement n'est trouvé, il affiche une ligne nulle.
Vous pouvez utiliser la propriété HeaderTemplate pour configurer l'en-tête par programme 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 code HTML.
Vous pouvez définir la propriété ShowHeadersWhenNoRecords de la ownertableableview sur true . Aspx:
<asp:GridView ID="RadGrid2" runat="server" >
<MasterTableView ShowHeadersWhenNoRecords="true" >
De même, lorsque la source de données pour le GridView est nulle (sans enregistrement), vous pouvez essayer de la définir comme suit: C #:
if (GridView1.DataSource == null)
{
GridView1.DataSource = new string[] { };
}
GridView1.DataBind();
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 conçue pour ne renvoyer 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>
Ensuite, j'ai créé un div avec les caractéristiques suivantes et je place un GridView à l'intérieur avec ShowHeader = "false" pour que la ligne du haut ait la même taille que toutes les autres.
<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>
Ajoutez cette propriété à votre affichage en grille: ShowHeaderWhenEmpty = "True" Cela pourrait aider à vérifier
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">
Ceci est un exemple de base de Gridview avec EmptyDataText et ShowHeaderWhenEmpty
Juste ajouter la propriété ShowHeaderWhenEmpty et la définir à true
Cette solution fonctionne pour moi
J'utilisais asp sqlDataSource. Cela a fonctionné pour moi lorsque j'ai défini le paramètre CancelSelectOnNullParameter sur false comme suit:
<asp:SqlDataSource ID="SqlData1" runat="server" ConnectionString="" SelectCommand="myStoredProcedure" SelectCommandType="StoredProcedure" CancelSelectOnNullParameter="False"> </asp:SqlDataSource>