加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

GridView在DataTable空行时不显示的处理

(2009-03-09 17:18:22)
标签:

it

分类: ASP.NET
问题:

       GridView控件应用很是广泛,通常将它与DataSourceControl搭配使用,当然也可以手工指定DataSource属性来完成数据绑定。如果数据源返回一个空行的数据集(例如查询不到指定记录等)时,将会出现两种情况:
       1.当GridView未指定<EmptyDataTemplate>或EmptyDataText属性时,控件将不会被最终生成,网页上的表现为空白,这样不仅感觉不爽,而且很容易造成布局的变形。
       2.如果指定了<EmptyDataTemplate>或EmptyDataText属性,网页上将最终产生一个table元素,它具有一行一格,可以显示出设置的提示信息,但是这种情况下该table将不会显示出表头来。
       通常希望的是,即使数据源返回一个空行的数据集,但是原有的Table元素也应该被显示出来,它应该带一个表头行,以及一个空白行。


   解决办法:

       通过手工向数据源添加一个新行即可解决。在此过程应该处理好以下几个方面的事情。
       1.在 New 一行时,如果包含主键列,则该列的值会被自动赋值(如 int 列会被赋值 0 )。对此应该手工将新行的每一列都赋值为 DBNull.Value ;
       2.由于可能存在有非空约束,会造成插入失败,因此必须手工将每一列的 AllowDBNull 属性重新设定
       以下示例 GridView 绑定至 ObjectDataSource 时的处理代码:
http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gifSelected事件
    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 中加一点小改进,处理一下那个空行。

http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gifDataBound事件
    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 即可以实现令人满意的效果,见下图。

            http://www.blogjava.net/images/blogjava_net/tw-ddm/10051/r_emptyDataSet.PNG

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有