GridView - Zeigt Header in einer leeren Datenquelle an


77

Wie zeige ich in C # immer noch die Überschriften einer Rasteransicht an, auch wenn die Datenquelle leer ist?

Ich generiere die Spalten nicht automatisch, da sie alle vordefiniert sind.

Derzeit mache ich Folgendes.

Holen Sie sich eine DataTable von einer gespeicherten Prozedur zurück, legen Sie die DataSource der Gridview fest und rufen Sie DataBind () auf.

Dies funktioniert gut, wenn ich Daten habe, aber wenn keine Zeilen zurückgegeben werden, erhalte ich nur eine leere Stelle, an der sich das Raster befinden sollte.

Bearbeiten: Vielen Dank an alle für die .NET 4+ -Eigenschaft. Ich habe dies in den .NET 3.5 Tagen gefragt. Das ist jetzt viel einfacher. :) :)

Antworten:


136

ASP.Net 4.0 hat die boolesche ShowHeaderWhenEmptyEigenschaft hinzugefügt .

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>

Hinweis: Die Header werden nur angezeigt, wenn DataBind () mit etwas anderem als null aufgerufen wird.

GridView1.DataSource = New List(Of String)
GridView1.DataBind()

14
Stellen Sie sicher, dass Sie mindestens eine Datenbindung haben. ShowHeadersWhenEmpty erfordert mindestens eine leere Listendatenbank.
Tenerezza

2
Was @Tenerezza erwähnt hat, ist wichtig, bitte fügen Sie dies in die Antwort ein. Das würde jemandem Zeit sparen.
James Poulose

34

Nachdem ich dies gepostet hatte, fand ich einen Weg, der funktioniert. Ich denke jedoch nicht, dass dies der beste Weg ist, damit umzugehen. Irgendwelche Vorschläge für einen besseren?

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

1
Dies wird auch den Trick tun. dtFunding.DataSource = dtFunding; dtFunding.DataBind ();
Zain Ali

5

Ich habe gerade dieses Problem durchgearbeitet, und keine dieser Lösungen würde für mich funktionieren. Ich konnte die EmptyDataTemplateEigenschaft nicht verwenden, da ich meine GridViewdynamisch mit benutzerdefinierten Feldern erstellt habe, die Filter in den Kopfzeilen bereitstellen. Ich konnte das Beispiel almny nicht verwenden, da ich ObjectDataSources anstelle von DataSetoder verwende DataTable. Ich fand diese Antwort jedoch auf einer anderen StackOverflow-Frage, die auf diese elegante Lösung verweist, mit der ich für meine spezielle Situation arbeiten konnte. Dabei wird die CreateChildControlsMethode überschrieben GridView, mit der dieselbe Kopfzeile erstellt wird, die erstellt worden wäre, wenn echte Daten vorhanden gewesen wären. Ich dachte, es lohnt sich, hier zu posten, wo es wahrscheinlich von anderen Leuten in einem ähnlichen Fix gefunden wird.


4

Wenn Sie mit ASP.NET 3.5 und niedriger arbeiten und Ihr Problem wie meines relativ einfach ist, können Sie einfach eine Nullzeile aus der SQL-Abfrage zurückgeben.

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

Diese Lösung erfordert keinen C # -Code oder ASP.NET-Code

  1. Stellen Sie sicher, dass Sie die Nullspalten in geeignete Namen umwandeln, da dies sonst nicht funktioniert.
  2. Andernfalls muss ein Block enthalten sein, der dieselbe Abfrage wie in ist if not exists (query part)
  3. In meinem Fall, wenn ich @RepID anstelle von 10 verwende. Dies ist einer DropDownList-Box außerhalb der Rasteransicht zugeordnet.

Jedes Mal, wenn ich das Dropdown-Menü ändere, um einen anderen Mitarbeiter auszuwählen, wird Gridview aktualisiert. Wenn kein Datensatz gefunden wird, wird eine Nullzeile angezeigt.


Danke Hammad Khan. Das hat bei uns funktioniert. Ich habe Dutzende von Threads dazu gelesen und dies ist das einzige Vorkommen dieses Nur-SQL-Ansatzes (oder hauptsächlich SQL - ich muss die Nullzeile ausblenden), auf den ich gestoßen bin. Wichtiger für uns: Dadurch wird auch die Fußzeile angezeigt, was ein schwierigeres Problem darstellt als die Anzeige der Kopfzeilen. :)
Zeek2

1
Ich bin froh, dass es für dich funktioniert hat, ziemlich einfache Lösung :)
Hammad Khan

3

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

showheaderwhenEmpty Eigentum


2

Sie können die HeaderTemplate-Eigenschaft verwenden, um den Kopf programmgesteuert einzurichten, oder stattdessen ListView verwenden, wenn Sie .NET 3.5 verwenden.

Persönlich bevorzuge ich ListView gegenüber GridView und DetailsView, wenn möglich, damit Sie mehr Kontrolle über Ihr HTML haben.


2

Sie können die ShowHeadersWhenNoRecords-Eigenschaft der ownertableview auf true setzen. aspx:

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

Auch wenn die Datenquelle für GridView null ist (wenn keine Datensätze vorhanden sind), können Sie versuchen, sie wie folgt festzulegen: c #:

  if (GridView1.DataSource == null)  
  {  
        GridView1.DataSource = new string[] { };  
  } 
  GridView1.DataBind();

1

Fügen Sie diese Eigenschaft Ihrer Rasteransicht hinzu: ShowHeaderWhenEmpty = "True". Dies kann hilfreich sein


1

Ich habe eine sehr einfache Lösung für das Problem gefunden. Ich habe einfach zwei GridViews erstellt. Die erste GridView rief eine DataSource mit einer Abfrage auf, die keine Zeilen zurückgeben sollte. Es enthielt einfach Folgendes:

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

Dann habe ich ein Div mit den folgenden Merkmalen erstellt und mit ShowHeader = "false" eine GridView darin platziert, sodass die oberste Zeile dieselbe Größe wie alle anderen Zeilen hat.

<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
<asp:GridView ID="grdGroup"  EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">

Dies ist ein grundlegendes Beispiel für Gridview mit EmptyDataText und ShowHeaderWhenEmpty


1

Juste fügt die ShowHeaderWhenEmpty-Eigenschaft hinzu und setzt sie auf true

Diese Lösung funktioniert bei mir


0

Ich habe asp sqlDataSource verwendet. Es hat bei mir funktioniert, als ich den CancelSelectOnNullParameter wie folgt auf false gesetzt habe:

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


-1
<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
Bitte erläutern Sie Ihren Code. Nur-Code-Antworten sind für das OP in der Regel nicht nützlich.
Mastov

-2

Sie können EmptyDataTextwie folgt verwenden:

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

Es werden keine Header angezeigt, sondern die Meldung "Keine Einträge gefunden". stattdessen.


2
Das ist nicht genau das, wonach ich gefragt habe. Ich suchte nach einer Möglichkeit, ein leeres Raster MIT Überschriften anzuzeigen. Ich weiß, dass ich EmptyDataText immer verwenden könnte, aber meine Anforderungen erforderten speziell ein leeres Raster mit Kopfzeilen, wenn keine Daten vorhanden waren.
Joshua Hudson

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

-3

Verwenden Sie eine EmptyDataTemplate wie unten. Wenn Ihre DataSource keine Datensätze enthält, wird Ihr Raster mit Überschriften und dem Literaltext oder HTML-Code in den EmptyDataTemplate-Tags angezeigt.

<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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.