web-dev-qa-db-fra.com

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.

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. :)

74
Joshua Hudson

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()
123
zacharydl

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;
}
32
Joshua Hudson

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

5
StriplingWarrior

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

showheaderwhenEmpty Propriété

3
vikram Jangra

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

  1. Assurez-vous de convertir les colonnes nulles en noms appropriés, sinon cela ne fonctionnera pas.
  2. Un autre bloc doit être inclus, ce qui correspond à la même requête que dans if not exists (query part)
  3. Dans mon cas, si j'utilise @RepID au lieu de 10. Ce qui est associé à une zone DropDownList en dehors de gridview.

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.

3
Hammad Khan

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. 

2
Liwen

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();
2
kez

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

Ajoutez cette propriété à votre affichage en grille: ShowHeaderWhenEmpty = "True" Cela pourrait aider à vérifier

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

Ceci est un exemple de base de Gridview avec EmptyDataText et ShowHeaderWhenEmpty

1
user2753577

Juste ajouter la propriété ShowHeaderWhenEmpty et la définir à true

Cette solution fonctionne pour moi

1
onlyme

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>

0
Md Toufiqul Islam