zoukankan      html  css  js  c++  java
  • 【转载】解决gridview空行时不显示的问题

    问题:

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

       解决办法:

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

     public void LoadData()
            {
                RheologicalPropertyForCementingSimulationDAL dalRheologicalPropertyForCementingSimulation = new RheologicalPropertyForCementingSimulationDAL();
                dtRheologicalPropertyForCementingSimulation = dalRheologicalPropertyForCementingSimulation.GetData();
                gcRheologicalPropertyForCementingSimulation.DataSource = dtRheologicalPropertyForCementingSimulation;
    
                if (dtRheologicalPropertyForCementingSimulation.Rows.Count == 0)
                {
                    //生成DataRow对象
                    DataRow row = dtRheologicalPropertyForCementingSimulation.NewRow();
    
                    foreach(DataColumn col in dtRheologicalPropertyForCementingSimulation.Columns)
                    {
                        //重新设置AllowDBNull属性
                        col.AllowDBNull = true;
                        //显示赋值成null
                        row[col] = DBNull.Value;
    
                    }
                    //将DataRow对象添加到table中
                    dtRheologicalPropertyForCementingSimulation.Rows.Add(row);
                }
            }

     效果示意如下:

    就此来说效果并不是十分理想,如果能够实现以下的效果那就更好了: 

      为达成目的,还需要在 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 即可以实现令人满意的效果。

  • 相关阅读:
    程序为什么加载到内存中
    cortex-A cortex-R cortex-M处理器的性能比较
    makefile 中的赋值方式
    python(老男孩全栈观后感------文件处理)
    python------lambda(匿名函数)
    python------filter(过滤器)
    Express深入解读
    nodejs安装
    一道有意思的题目
    charAt获取数组,测试
  • 原文地址:https://www.cnblogs.com/Alex1994/p/9761360.html
Copyright © 2011-2022 走看看