webentwicklung-frage-antwort-db.com.de

GridView - Kopfzeilen für leere Datenquelle anzeigen

In C # zeige ich immer noch die Header eines Gridview, auch wenn die Datenquelle leer ist. 

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

Derzeit mache ich Folgendes:.

Rufen Sie eine DataTable aus einer gespeicherten Prozedur ab, legen Sie die DataSource der Rasteransicht fest und rufen Sie DataBind () auf.

Das funktioniert gut, wenn ich Daten habe, aber wenn keine Zeilen zurückgegeben werden, bekomme ich nur eine leere Stelle, wo das Raster liegen soll.

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

74
Joshua Hudson

ASP.Net 4.0 fügte die boolesche ShowHeaderWhenEmpty-Eigenschaft hinzu.

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 einem anderen Wert als null aufgerufen wird.

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

Nachdem ich dies veröffentlicht habe, habe ich einen Weg gefunden, der funktioniert. Ich glaube 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;
}
32
Joshua Hudson

Ich habe gerade dieses Problem durchgearbeitet, und keine dieser Lösungen würde für mich funktionieren. Ich konnte die EmptyDataTemplate-Eigenschaft nicht verwenden, da ich meine GridView dynamisch mit benutzerdefinierten Feldern erstellte, die Filter in den Kopfzeilen bereitstellen. Ich konnte das Beispiel almny posted nicht verwenden, da ich ObjectDataSources anstelle von DataSet oder DataTable verwende. Ich fand jedoch diese Antwort in einer anderen StackOverflow-Frage, die auf diese elegante Lösung verweist, die ich für meine spezielle Situation erledigen konnte. Es beinhaltet das Überschreiben der CreateChildControls-Methode der GridView, um dieselbe Kopfzeile zu erstellen, die erstellt worden wäre, wenn echte Daten vorhanden wären. Ich dachte, es lohnt sich, hier zu posten, wo es wahrscheinlich von anderen Leuten in einem ähnlichen Fix gefunden wird.

5

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

showheaderwhenEmpty Eigenschaft

3
vikram Jangra

Wenn Sie mit ASP.NET 3.5 und niedriger arbeiten und Ihr Problem relativ einfach ist wie meines, 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 entsprechende Namen umwandeln, sonst funktioniert es nicht.
  2. Sonst muss ein Block enthalten sein, der die gleiche Abfrage wie in if not exists (query part) ist.
  3. In meinem Fall, wenn ich @RepID anstelle von 10 verwende. Welches wird einem DropDownList-Feld außerhalb von gridview zugeordnet.

Jedes Mal, wenn ich die Dropdown-Liste zur Auswahl einer anderen Wiederholung ändere, wird Gridview aktualisiert. Wenn kein Datensatz gefunden wird, wird eine Nullzeile angezeigt.

3
Hammad Khan

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

Persönlich bevorzuge ich ListView gegenüber GridView und DetailsView, wenn möglich. Dadurch haben Sie mehr Kontrolle über Ihre HTML-Datei. 

2
Liwen

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

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

Wenn die Datenquelle für die GridView gleich null ist (wenn keine Datensätze vorhanden sind), können Sie versuchen, sie wie folgt einzustellen:

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

Ich habe eine sehr einfache Lösung für das Problem gefunden. Ich habe einfach zwei GridViews erstellt. Die erste GridView hat eine DataSource mit einer Abfrage aufgerufen, die keine Zeilen zurückgeben soll. 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 Eigenschaften erstellt und ein GridView mit ShowHeader = "false" darin platziert, so dass die oberste Zeile die gleiche Größe hat wie alle anderen Zeilen.

<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

Fügen Sie diese Eigenschaft zu Ihrer Rasteransicht hinzu: ShowHeaderWhenEmpty = "True" .__

1
tariq
<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
user2753577

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

Diese Lösung funktioniert für mich

1
onlyme

Ich habe asp sqlDataSource verwendet. Es hat für mich funktioniert, wenn ich CancelSelectOnNullParameter wie folgt auf false gesetzt habe:

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

0