GridView当数据源为空时如何实现显示表头

时间:2022-10-03 14:44:06
问题: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!