???問題:
??????GridView控件應用很是廣泛,通常將它與DataSourceControl搭配使用,當然也可以手工指定DataSource屬性來完成數據綁定。如果數據源返回一個空行的數據集(例如查詢不到指定記錄等)時,將會出現兩種情況:
??????1.當GridView未指定<EmptyDataTemplate>或EmptyDataText屬性時,控件將不會被最終生成,網頁上的表現為空白,這樣不僅感覺不爽,而且很容易造成布局的變形。
??????2.如果指定了<EmptyDataTemplate>或EmptyDataText屬性,網頁上將最終產生一個table元素,它具有一行一格,可以顯示出設置的提示信息,但是這種情況下該table將不會顯示出表頭來。
??????通常希望的是,即使數據源返回一個空行的數據集,但是原有的Table元素也應該被顯示出來,它應該帶一個表頭行,以及一個空白行。
???解決辦法:
??????通過手工向數據源添加一個新行即可解決。在此過程應該處理好以下幾個方面的事情。
??????1.在 New 一行時,如果包含主鍵列,則該列的值會被自動賦值(如 int 列會被賦值 0 )。對此應該手工將新行的每一列都賦值為 DBNull.Value?;
??????2.由于可能存在有非空約束,會造成插入失敗,因此必須手工將每一列的 AllowDBNull 屬性重新設定
??????以下示例 GridView 綁定至 ObjectDataSource 時的處理代碼:


????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 | 標題... |
---|---|---|
? | ? | ? |
??????就此來說效果并不是十分理想,如果能夠實現以下的效果那就更好了:
標題1 | 標題2 | 標題... |
---|---|---|
沒有查找到符合條件的記錄 |
??????為達成目的,還需要在 GridView 中加一點小改進,處理一下那個空行。


????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 即可以實現令人滿意的效果,見下圖。
????????????