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空数据集效果图
相关文章
相关标签/搜索