81 votes

GridView - Afficher les en-têtes sur une source de données vide

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.

144voto

zacharydl Points 1294

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

35voto

Joshua Hudson Points 1091

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

5voto

StriplingWarrior Points 56276

Je viens de travailler par le biais de ce problème, et aucune de ces solutions serait de travailler pour moi. Je ne pouvais pas utiliser l' EmptyDataTemplate bien parce que j'étais en train de créer mon GridView de façon dynamique, avec des champs personnalisés qui offrent des filtres dans les en-têtes. Je ne pouvais pas utiliser l'exemple almny posté parce que je suis à l'aide d' ObjectDataSources au lieu de DataSet ou DataTable. Cependant, j'ai trouvé cette réponse a posté sur un autre StackOverflow question, qui renvoie à cette élégante solution que j'ai été en mesure de faire le travail pour mon cas en particulier. Il implique la substitution de l' CreateChildControls méthode de GridView afin de créer la même ligne d'en-tête qui aurait été créé s'il n'avait été réel des données. 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.

4voto

Nick Points 2689

Si vous travaillez avec ASP.NET 3.5 et inférieur, et votre problème est relativement simple comme le mien, vous pouvez simplement retourner un null ligne 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 que vous lancez la valeur null dans les colonnes des noms appropriés, sinon il ne fonctionnera pas.
  2. D'autre bloc doit être inclus, ce qui est la même requête que dans if not exists (query part)
  3. Dans mon cas, si je suis à l'aide de @RepID, au lieu de 10. Qui est associé à une DropDownList à l'extérieur de la boîte de contrôle gridview.

Chaque fois que je change la liste déroulante pour sélectionner un autre rep, Gridview est mis à jour. Si aucun enregistrement n'est trouvé, il affiche une valeur null à la ligne.

2voto

Liwen Points 507

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X