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


????protected?void?ObjectDataSource2_Selected(object?sender,?ObjectDataSourceStatusEventArgs?e)?{
????????//轉(zhuǎn)型到DataTable
????????DataTable?table?=?(DataTable)e.ReturnValue;
????????//如果返回的是張空表
????????if?(table.Rows.Count?==?0)?{
????????????//生成DataRow對(duì)象
????????????DataRow?row?=?table.NewRow();
????????????foreach?(DataColumn?col?in?table.Columns)?{
????????????????//重新設(shè)置AllowDBNull屬性
????????????????col.AllowDBNull?=?true;
????????????????//顯式賦值成null
????????????????row[col]?=?DBNull.Value;
????????????}
????????????//將DataRow對(duì)象添加至table中
????????????table.Rows.Add(row);
????????}
????}
??????效果示意如下:
標(biāo)題1 | 標(biāo)題2 | 標(biāo)題... |
---|---|---|
? | ? | ? |
??????就此來說效果并不是十分理想,如果能夠?qū)崿F(xiàn)以下的效果那就更好了:
標(biāo)題1 | 標(biāo)題2 | 標(biāo)題... |
---|---|---|
沒有查找到符合條件的記錄 |
??????為達(dá)成目的,還需要在 GridView 中加一點(diǎn)小改進(jìn),處理一下那個(gè)空行。


????protected?void?GridView1_DataBound(object?sender,?EventArgs?e)?{
????????//如果是空行,判斷條件為:行數(shù)=1且主鍵列=DBNull.Value,如果需要區(qū)分是初始化/提交狀態(tài),可以加入?Page.IsPostBack 判斷
????????if?(GridView1.DataKeys.Count?==?1?&&?GridView1.DataKeys[0].Values[0]?==?DBNull.Value)?{
????????????//清除掉該空行的全部單元格
????????????GridView1.Rows[0].Cells.Clear();
????????????//新建單元格對(duì)象
????????????TableCell?cell?=?new?TableCell();
????????????//合并單元格
????????????cell.ColumnSpan?=?GridView1.Columns.Count;
????????????//GridView1.EmptyDataText已經(jīng)設(shè)置為??"沒有查找到符合條件的記錄"
????????????//設(shè)置單元格內(nèi)容為GridView1.EmptyDataText,把提示文本給分離出來
????????????cell.Text?=?GridView1.EmptyDataText;
????????????//向空行中加入單元格
????????????GridView1.Rows[0].Cells.Add(cell);
????????????//讓該行應(yīng)用EmptyDataRowStyle樣式,這樣可以更加靈活,比如可以很容易的應(yīng)用主題
????????????GridView1.Rows[0].ApplyStyle(GridView1.EmptyDataRowStyle);
????????}
????????
????}
??????如此一來,配合 GridView 的 EmptyDataText , EmptyDataRowStyle 即可以實(shí)現(xiàn)令人滿意的效果,見下圖。
????????????