問題:
GridView控件應用非常普遍,一般將它與DataSourceControl搭配使用,固然也能夠手工指定DataSource屬性來完成數據綁定。若是
數據源返回一個空行的數據集(例如查詢不到指定記錄等)時,將會出現兩種狀況:
1.當GridView未指定<EmptyDataTemplate>或EmptyDataText屬性時,控件將不會被最終生成,網頁上的表現爲空白,這樣不只感受不爽,並且很容易形成佈局的變形。
2.若是指定了<EmptyDataTemplate>或EmptyDataText屬性,網頁上將最終產生一個table元素,它具備一行一格,能夠顯示出設置的提示信息,可是這種狀況下該table將不會顯示出表頭來。
一般但願的是,即便數據源返回一個空行的數據集,可是原有的Table元素也應該被顯示出來,它應該帶一個表頭行,以及一個空白行。
解決辦法:
經過手工向數據源添加一個新行便可解決。在此過程應該處理好如下幾個方面的事情。
1.在 New 一行時,若是包含主鍵列,則該列的值會被自動賦值(如 int 列會被賦值 0 )。對此應該手工將新行的每一列都賦值爲 DBNull.Value ;
2.因爲可能存在有非空約束,會形成插入失敗,所以必須手工將每一列的 AllowDBNull 屬性從新設定
如下示例 GridView 綁定至 ObjectDataSource 時的處理代碼:
Selected事件
protected void ObjectDataSource2_Selected(object sender, ObjectDataSourceStatusEventArgs e) {
//轉型到DataTable
DataTable table = (DataTable)e.ReturnValue;
//若是返回的是張空表
if (table.Rows.Count == 0) {
//生成DataRow對象
DataRow row = table.NewRow();
foreach (DataColumn col in table.Columns) {
//從新設置AllowDBNull屬性
col.AllowDBNull = true;
//顯式賦值成null
row[col] = DBNull.Value;
}
//將DataRow對象添加至table中
table.Rows.Add(row);
}
}
效果示意以下:
就此來講效果並非十分理想,若是可以實現如下的效果那就更好了:
標題1 |
標題2 |
標題... |
沒有查找到符合條件的記錄 |
爲達成目的,還須要在 GridView 中加一點小改進,處理一下那個空行。
DataBound事件
protected void GridView1_DataBound(object sender, EventArgs e) {
//若是是空行,判斷條件爲:行數=1且主鍵列=DBNull.Value,若是須要區分是初始化/提交狀態,能夠加入 Page.IsPostBack 判斷
if (GridView1.DataKeys.Count == 1 && GridView1.DataKeys[0].Values[0] == DBNull.Value) {
//清除掉該空行的所有單元格
GridView1.Rows[0].Cells.Clear();
//新建單元格對象
TableCell cell = new TableCell();
//合併單元格
cell.ColumnSpan = GridView1.Columns.Count;
//GridView1.EmptyDataText已經設置爲 "沒有查找到符合條件的記錄"
//設置單元格內容爲GridView1.EmptyDataText,把提示文本給分離出來
cell.Text = GridView1.EmptyDataText;
//向空行中加入單元格
GridView1.Rows[0].Cells.Add(cell);
//讓該行應用EmptyDataRowStyle樣式,這樣能夠更加靈活,好比能夠很容易的應用主題
GridView1.Rows[0].ApplyStyle(GridView1.EmptyDataRowStyle);
}
}
如此一來,配合 GridView 的 EmptyDataText , EmptyDataRowStyle 便可以實現使人滿意的效果,見下圖。