GridView在DataTable空行時不顯示的處理

問題:

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

             GridView空數據集效果圖
相關文章
相關標籤/搜索