zoukankan      html  css  js  c++  java
  • GridView当数据源为空时如何实现显示表头

    问题:asp.net 2.0 中引入的GridView控件当其数据源为空时(GridView.DataSource=null)不能显示
    出表头.

    解决:

    方法一:采用其EmptyTemplate来实现,模版中写一个静态的table;
    缺点: 麻烦,每个GridVIew都需要设置一下.

    方法二: 若数据源为DataTable,则当无数据时,始终返回一个空行的DataTable;
    若数据源是集合类(ArrayList,List<T>等),无数据时,生成一个空的实体,加入到集合类中.
    缺点: 还是麻烦.

    方法三:
    也是要给大家介绍的方法: 扩展GridView来实现.继承GridVie,重写Render方法,当其数据源为空时做一下处理,直接看代码吧:

        /// <summary>
        /// GridView 扩展控件
        /// @author:jianyi0115@163.com
        /// </summary>
         public class GridView : System.Web.UI.WebControls.GridView
        {       
            private bool _enableEmptyContentRender 
    = true ;
            
    /// <summary>
            /// 是否数据为空时显示标题行
            /// </summary>
            public bool EnableEmptyContentRender
            {
                set { _enableEmptyContentRender 
    = value; }
                get { 
    return _enableEmptyContentRender; }
            }

            private string _EmptyDataCellCssClass ;
            
    /// <summary>
            /// 为空时信息单元格样式类
            /// </summary>
            public string EmptyDataCellCssClass
            {
                set { _EmptyDataCellCssClass 
    = value ; }
                get { 
    return _EmptyDataCellCssClass ; }
            }

            
    /// <summary>
            /// 为空时输出内容
            /// </summary>
            /// <param name="writer"></param>
            protected virtual void RenderEmptyContent(HtmlTextWriter writer)
            {
                Table t 
    = new Table(); //create a table
                t.CssClass 
    = this.CssClass; //copy all property
                t.GridLines 
    = this.GridLines;
                t.BorderStyle 
    = this.BorderStyle;
                t.BorderWidth 
    = this.BorderWidth;
                t.CellPadding 
    = this.CellPadding;
                t.CellSpacing 
    = this.CellSpacing;

                t.HorizontalAlign 
    = this.HorizontalAlign;

                t.Width 
    = this.Width;

                t.CopyBaseAttributes(
    this);

                TableRow row 
    = new TableRow();
                t.Rows.Add(row);

                foreach (DataControlField f 
    in this.Columns) //generate table header
                {
                    TableCell cell 
    = new TableCell();

                    cell.Text 
    = f.HeaderText;

                    cell.CssClass 
    = "TdHeaderStyle1"; //这里把表头样式写死了

                    row.Cells.Add(cell);
                }

                TableRow row2 
    = new TableRow();
                t.Rows.Add(row2);

                TableCell msgCell 
    = new TableCell();
                msgCell.CssClass 
    = this._EmptyDataCellCssClass;

                
    if (this.EmptyDataTemplate != null) //the second row, use the template
                {
                    
    this.EmptyDataTemplate.InstantiateIn(msgCell);
                }
                
    else //the second row, use the EmptyDataText
                {
                    msgCell.Text 
    = this.EmptyDataText;
                }

                msgCell.HorizontalAlign 
    = HorizontalAlign.Center;
                msgCell.ColumnSpan 
    = this.Columns.Count;

                row2.Cells.Add(msgCell);

                t.RenderControl(writer);
           }

            protected override 
    void  Render(HtmlTextWriter writer)
            {
                
    if ( _enableEmptyContentRender && ( this.Rows.Count == 0 || this.Rows[0].RowType == DataControlRowType.EmptyDataRow) )
                {
                    RenderEmptyContent(writer);
                }
                
    else
                {
                    base.Render(writer);
                }
            }    

        }
    }


    I love the improvement!



  • 相关阅读:
    内置函数详解
    lambda函数
    第八章(5)
    第八章(4)
    第八章(3)
    第八章(2)
    第八章(1)
    第七章(3)
    第七章(2)
    第七章(1)
  • 原文地址:https://www.cnblogs.com/jianyi0115/p/677728.html
Copyright © 2011-2022 走看看