gridview无数据行时显示表头的方法

 

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);
            }
        }   
    }
}

REF:

http://mattberseth2.com/demo/Default.aspx?Name=How+To%3a+Show+Header+and+Footer+Rows+in+an+Empty+GridView&Filter=All

http://www.cnblogs.com/jianyi0115/archive/2007/03/16/677728.html

http://www.cnblogs.com/linux-withwind/archive/2007/03/22/684180.html

posted @   emanlee  阅读(1918)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示