Das GridView Control eignet sich hervorragend um Daten jeglicher Art anzuzeigen. Sind allerdings keine Daten vorhanden, wird das gesamte Control ausgeblendet. Eine häufige Anforderung ist es jedoch einen Text, welcher auf die nicht vorhandenen Daten hinweist und die Überschriften, der Tabelle anzuzeigen.

Um dieses Problem zu lösen bietet sich ein CustomControl an, welches vom GridView abgeleitet und um die benötigte Funktionalität erweitert wird. Die benötigten Funktionen definieren sich wie folgt:
- Möglichkeit das GridView trotz leerer Daten anzuzeigen
- Eingabe eines Textes, der bei leeren Daten angezeigt wird
Zunächst müssen die zusätzlichen Eigenschaften definiert werden. Die Eingaben sollten im ViewState abgelegt werden, damit diese auch nach einem PostBack zur Verfügung stehen.
public bool ShowEmptyTable
{
get
{
object o = ViewState["ShowEmptyTable"];
return (o != null ? (bool)o : true);
}
set
{
ViewState["ShowEmptyTable"] = value;
}
}
public string EmptyText
{
get
{
object o = ViewState["EmptyText"];
return (o != null ? o.ToString() : "");
}
set
{
ViewState["EmptyText"] = value;
}
}
Anschließend wird die Methode CreateChildControls überschrieben und angepasst. Sind keine Zeilen an das GridView gebunden und die Eigenschaft ShowEmptyTable gesetzt, wird zuerst der Kopf der Tabelle inkl. der Überschriften eingefügt. Weiter wird eine leere Zeile hinzugefügt, die den Text der Eigenschaft EmptyText anzeigt.
protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
{
int numRows = base.CreateChildControls(dataSource, dataBinding);
if (numRows == 0 && ShowEmptyTable)
{
Table table = new Table();
table.ID = this.ID;
GridViewRow row = base.CreateRow(-1, -1, DataControlRowType.Header, DataControlRowState.Normal);
DataControlField[] fields = new DataControlField[this.Columns.Count];
this.Columns.CopyTo(fields, 0);
this.InitializeRow(row, fields);
table.Rows.Add(row);
row = new GridViewRow(-1, -1, DataControlRowType.DataRow, DataControlRowState.Normal);
TableCell cell = new TableCell();
cell.ColumnSpan = this.Columns.Count;
cell.Width = Unit.Percentage(100);
cell.Controls.Add(new LiteralControl(EmptyText));
row.Cells.Add(cell);
table.Rows.Add(row);
this.Controls.Add(table);
}
return numRows;
}
Um das abgeänderte GridView zu verwenden, muss es um Webprojekt referenziert und per Web.Config registriert werden.
<controls>
<add assembly="EmptyGridView" namespace="EmptyGridView" tagPrefix="CC"/>
controls>
Ist dies geschehen, können die Eigenschaften direkt per IntelliSense aufgerufen und gesetzt werden. In diesem Beispiel wird eine leere Tabelle mit dem Namen MyData an das GridView gebunden. Die Tabelle enthält nur eine Spalte mit dem Namen Data.
<CC:EmptyGridView id="grid" runat="server" ShowEmptyTable="True" EmptyText="Keine Daten vorhanden" AutoGenerateColumns="False" DataSourceID="SqlDataSource1" >
<Columns>
<asp:BoundField DataField="Data" HeaderText="Data" SortExpression="Data" />
</Columns>
</CC:EmptyGridView>
Das abgeänderte GridView Control kann in mehreren Projekten eingesetzt werden und bietet den vollen Funktionsumfang des eigentlichen GridView Controls. Das gesamte Projekt inkl. Beispielapplikation kann hier runtergeladen werden. Um das EmptyGridView Control direkt einsetzten, reicht dieser Download.