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. :)
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()
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;
}
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 ObjectDataSource
s 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.
"<asp:GridView AutoGenerateColumns="false" ShowHeaderWhenEmpty="true""
setzen
showheaderwhenEmpty
Eigenschaft
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
if not exists (query part)
ist.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.
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.
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();
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>
Fügen Sie diese Eigenschaft zu Ihrer Rasteransicht hinzu: ShowHeaderWhenEmpty = "True" .__
<asp:GridView ID="grdGroup" EmptyDataText="No Records Found" ShowHeaderWhenEmpty="True" runat="server">
Dies ist ein grundlegendes Beispiel für Gridview mit EmptyDataText und ShowHeaderWhenEmpty
Juste fügt die ShowHeaderWhenEmpty-Eigenschaft hinzu und setzt sie auf true
Diese Lösung funktioniert für mich
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>