另辟蹊径当gridview数据源为空的时候显示列头

本文介绍了一种解决GridView在数据源为空时不显示列头的问题的方法。通过在PreRender事件中添加自定义代码,即使数据为空也能确保列头正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     如果只给gridview控件设置了绑定字段的模板,那么如果数据源为空的时候,默认情况下是不显示列头的,这大大影响了页面的友好性。

    为解决这个问题,其中一个方法就是是用方法给gridview的数据源添加一个空行的数据源,然后再绑定,这样在页面中就显示出标头了。

    这是一种解决问题的思路,但是如果有n个gridview,且数据源又都不相同的时候怎么办呢?要给每一种数据源都添加一个空行吗?看来这种做法并不是解决问题的最优思路,这里学习一种新的方法,从控件的角度去解决问题:

        /// <summary>
        /// 当grid数据为空是给grid添加列头
         /// 此方法在grid的PreRender事件中调用
         /// </summary>
        /// <param name="grid">grid控件</param>
        protected void CreateHeaderRow(GridView grid)
        {

            Table maintable = null;
            if (grid.Controls.Count == 0)
            {
                maintable = new Table();
                maintable.ApplyStyle(grid.ControlStyle);
                grid.Controls.Add(maintable);
            }
            else
                maintable = grid.Controls[0] as Table;

            bool IsCreateHeader = false;

            bool IsCreateEmptyRow = false;

            if (maintable.Rows.Count == 0)
            {
                IsCreateHeader = true;
                IsCreateEmptyRow = true;
            }
            else
            {
                GridViewRow gvr = maintable.Rows[0] as GridViewRow;
                if (gvr.RowType == DataControlRowType.EmptyDataRow)
                {
                    maintable.Rows.Clear();
                    IsCreateHeader = true;
                    IsCreateEmptyRow = true;
                }
                else
                {
                    IsCreateHeader = false;
                    IsCreateEmptyRow = false;
                }
            }

            int ColumnCount = 0;

            if (IsCreateHeader)
            {
                GridViewRow gvr = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
                gvr.ApplyStyle(grid.HeaderStyle);
                for (int i = 0; i < grid.Columns.Count; i++)
                {
                    DataControlField column = grid.Columns[i];

                    if (column.ShowHeader)
                    {
                        ColumnCount++;

                        DataControlFieldHeaderCell tc = new DataControlFieldHeaderCell(column);
                        tc.ApplyStyle(column.HeaderStyle);
                        column.InitializeCell(tc, DataControlCellType.Header, DataControlRowState.Normal, 0);

                        gvr.Cells.Add(tc);
                    }
                }
                maintable.Rows.AddAt(0, gvr);
            }

            if (IsCreateEmptyRow)
            {
                if (grid.EmptyDataText != string.Empty)
                {
                    GridViewRow gvr = new GridViewRow(0, 0, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
                    gvr.ApplyStyle(grid.EmptyDataRowStyle);
                    TableCell tc = new TableCell();
                    tc.Text = grid.EmptyDataText;
                    tc.ColumnSpan = ColumnCount;

                    gvr.Cells.Add(tc);

                    maintable.Rows.Add(gvr);
                }
            }

        }


 

     这样在要调用的界面中gridview的PreRender事件中调用该方法就可以了,而且调用也很简单,直接将gridview控件名传进来即可。

    总结:这种解决问题的思路则是从控件的内部机制中,不依赖于本身就千变万化的数据源,使用datatable对象和gridview对象的相互交互,巧妙的解决了问题,这种解决问题的思路和方法值得借鉴和学习。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值