当GridView中没有数据要显示时,默认情况控件将不被显示。如果你想即便在没有数据时也显示标题行,你可以创建一个临时的包含空记录的DataTable对象,接着在页面的Init事件中绑定该GridView控件到这个DataTable。下例说明了如何去做。
- protected void GridView1_Init(Object sender, EventArgs e)
- {
- DataTable dt = new DataTable();
- dt.Columns.Add("Column1");
- dt.Columns.Add("Column2");
- DataRow dr = dt.NewRow();
- dr["Column1"] = "";
- dr["Column2"] = "";
- dt.Rows.Add(dr);
- GridView1.DataSource = dt;
- GridView1.DataBind();
- }
另一种解决方法是从GridView继承并重写CreateChildControls方法,该方法能自动利用现有列布局,并移除使用外在DataTable对象的需求。下例说明了如何去做
- public class EmptyGridView : GridView
- {
- #region Properties
- /// <summary>
- /// Enable or Disable generating an empty table if no data rows in source
- /// </summary>
- [
- Description("Enable or disable generating an empty table with headers
- when no data rows are available in the data source."),
- Category("Misc"),
- DefaultValue("true"),
- ]
- public bool ShowEmptyTable
- {
- get
- {
- object o = ViewState["ShowEmptyTable"];
- return (o != null ? (bool)o : true);
- }
- set
- {
- ViewState["ShowEmptyTable"] = value;
- }
- }
- /// <summary>
- /// Get or Set Text to display in empty data row
- /// </summary>
- [
- Description("Text to display in the empty data row."),
- Category("Misc"),
- DefaultValue(""),
- ]
- public string EmptyTableRowText
- {
- get
- {
- object o = ViewState["EmptyTableRowText"];
- return (o != null ? o.ToString() : "");
- }
- set
- {
- ViewState["EmptyTableRowText"] = value;
- }
- }
- #endregion
- protected override int CreateChildControls(System.Collections.IEnumerable
- dataSource, bool dataBinding)
- {
- int numRows = base.CreateChildControls(dataSource, dataBinding);
- // No data rows created, so create an empty table if enabled.
- if (numRows == 0 && ShowEmptyTable)
- {
- //create table
- Table table = new Table();
- table.ID = this.ID;
- //create a new header row
- GridViewRow row = base.CreateRow(-1, -1, DataControlRowType.Header,
- DataControlRowState.Normal);
- //convert the exisiting columns into an array and initialize
- DataControlField[] fields = new
- DataControlField[this.Columns.Count];
- this.Columns.CopyTo(fields, 0);
- this.InitializeRow(row, fields);
- table.Rows.Add(row);
- //create the empty 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(EmptyTableRowText));
- row.Cells.Add(cell);
- table.Rows.Add(row);
- this.Controls.Add(table);
- }
- return numRows;
- }
- }