控件扩展 - GridView分页及数据源为空

代码
    /// <summary>
    
/// 重写分页,及数据源为空时显示表头
    
/// </summary>
    public class GridviewExpand : System.Web.UI.WebControls.GridView
    {
        
#region 扩展属性

        
/// <summary>
        
/// Gridview 分页是否重写
        
/// </summary>
        public ThisPagerType ExpendPagerType
        {
            
get
            {
                
return (ViewState["PagerType"!= null ? (ThisPagerType)ViewState["PagerType"] : ThisPagerType.ChangeStyle);
            }
            
set
            {
                ViewState[
"PagerType"= value;
            }
        }

        
/// <summary>
        
/// 数据源为空时,是否显示表头(true:显示)
        
/// </summary>
        public Boolean ExpendEmptyHeader
        {
            
get
            {
                
return _enableEmptyContentRender;
            }
            
set
            {
                _enableEmptyContentRender 
= value;
            }
        }

        
public enum ThisPagerType
        {
            
//样式不变
            Regular = 0,
            
//样式变化
            ChangeStyle = 1
        }
        
#endregion

        
/// <summary>
        
/// 重写InitializePager 添加想要的样式
        
/// </summary>
        
/// <param name="row"></param>
        
/// <param name="columnSpan"></param>
        
/// <param name="pagedDataSource">数据源</param>
        protected override void InitializePager(GridViewRow row, int columnSpan, PagedDataSource pagedDataSource)
        {
            
if (ExpendPagerType == ThisPagerType.Regular)
            {
                
//如果样式是Regular,即不为扩展样式
                base.InitializePager(row, columnSpan, pagedDataSource);
            }
            
else
            {
                TableCell cell_1 
= InitPageCell(pagedDataSource);

                row.Cells.Add(cell_1);
                row.Cells[
0].ColumnSpan = Columns.Count;
                row.Cells[
0].HorizontalAlign = HorizontalAlign.Right;
                
this.Controls[0].Controls.AddAt(0, row);
            }
        }


        
#region TabCell 分页单元格样式:记录数:1~10/30  页数:1/2 上一页 下一页 转到 __ 页


        
//填写跳转到多少页
        TextBox page = new TextBox();

        
//链接 
        LinkButton PageTo = new LinkButton();

        
#region 分页信息生成

        
/// <summary>
        
/// 记录数:1~10/22  
        
/// </summary>
        
/// <param name="rowCount"></param>
        
/// <returns></returns>
        private Label RecordInfo(int rowCount)
        {
            Label label 
= new Label();
            
int currentPageFirstRow = ((PageIndex * PageSize) + 1);
            
int currentPageLastRow = 0;
            
int lastPageRemainder = rowCount % PageSize;

            
if (lastPageRemainder == 0)
            {
                lastPageRemainder 
= PageSize;
            }
            currentPageLastRow 
= (PageCount == PageIndex + 1? (currentPageFirstRow + lastPageRemainder - 1) : (currentPageFirstRow + PageSize - 1);
            label.Text 
= String.Format("记录数: {0}~{1}/{2}  ", currentPageFirstRow, currentPageLastRow, rowCount);
            
return label;
        }

        
/// <summary>
        
/// 页数:1/10
        
/// </summary>
        
/// <returns></returns>
        private Label PageInfo()
        {
            Label pageInfo 
= new Label();
            pageInfo.Text 
= "页数: " + (PageIndex + 1).ToString() + "/" + PageCount.ToString() + "  ";
            
return pageInfo;
        }

        
/// <summary>
        
/// 导航按键【首页 上一页 下一页 末页】
        
/// </summary>
        
/// <param name="type"></param>
        
/// <returns></returns>
        private LinkButton NavigateLink(NavigateType type)
        {
            LinkButton button 
= new LinkButton();

            
switch (type)
            {
                
case NavigateType.first:
                    {
                    }
                    
break;
                
case NavigateType.prev:
                    {
                        button.Text 
= "上一页";
                        button.CommandArgument 
= string.Format("{0}", (PageIndex - 1));
                        button.Enabled 
= (PageIndex > 0);
                    }
                    
break;
                
case NavigateType.next:
                    {
                        button.Text 
= "下一页";
                        button.CommandArgument 
= string.Format("{0}", (PageIndex + 1));
                        button.Enabled 
= (PageIndex < (PageCount - 1));
                    }
                    
break;
                
case NavigateType.last:
                    {
                    }
                    
break;
            }
            button.Click 
+= new EventHandler(navigate_Click);
            
return button;
        }

        
private enum NavigateType
        {
            first,
            prev,
            next,
            last
        }

        
#endregion

        
#region 跳转事件

        
protected virtual void navigate_Click(object sender, EventArgs e)
        {
            OnPageIndexChanging(
new GridViewPageEventArgs(int.Parse(((LinkButton)sender).CommandArgument)));
        }

        
//跳转到第几页
        protected virtual void PageTo_Click(object sender, EventArgs e)
        {
            
if (page.Text.Trim() == "")
            {
                page.Text 
= "0";
            }
            
else
            {
                
try
                {
                    
int.Parse(page.Text.Trim());
                }
                
catch (Exception ex)
                {

                    page.Text 
= "0";
                }
            }
            
if (int.Parse(page.Text.Trim()) < 1)
            {
                page.Text 
= "0";
            }
            
else
            {
                
int num = int.Parse(page.Text.Trim());
                num
--;
                page.Text 
= num.ToString();

            }

            PageTo.CommandArgument 
= page.Text.Trim();


            OnPageIndexChanging(
new GridViewPageEventArgs(int.Parse(((LinkButton)sender).CommandArgument)));

            
//矫正显示页数
            if (int.Parse(page.Text.Trim()) < 1)
            {
                page.Text 
= "1";
            }
            
else if (int.Parse(page.Text.Trim()) > PageCount)
            {
                page.Text 
= PageCount.ToString();
            }
            
else
            {
                page.Text 
= (PageIndex + 1).ToString();
            }

        }
        
#endregion

        
/// <summary>
        
/// 跳转文本框 样式为 pagetxt
        
/// </summary>
        
/// <param name="pagedDataSource"></param>
        
/// <returns></returns>
        protected TableCell InitPageCell(PagedDataSource pagedDataSource)
        {
            
//分页单元格
            TableCell cell_1;

            
#region 设置属性

            
//记录数 1~2/3
            Label recordinfo = RecordInfo(pagedDataSource.DataSourceCount);

            
//页数 1/10
            Label pageinfo = PageInfo();

            
//上一页
            LinkButton prev = NavigateLink(NavigateType.prev);

            
//下一页
            LinkButton next = NavigateLink(NavigateType.next);

            
//转到 __ 页
            PageTo.Text = "转到";
            PageTo.Click 
+= new System.EventHandler(PageTo_Click);

            page.Attributes.Add(
"class""pagetxt");
            page.Attributes.Add(
"style""width:20px");

            Label pagelabel 
= new Label();
            pagelabel.Text 
= "";

            
#endregion

            
#region 设置位置

            cell_1 
= new TableCell();

            
//记录数
            cell_1.Controls.Add(recordinfo);

            
//页数
            cell_1.Controls.Add(pageinfo);

            
//上一页
            cell_1.Controls.Add(prev);

            
//间隔
            cell_1.Controls.Add(new LiteralControl("&nbsp;&nbsp;"));

            
//下一页
            cell_1.Controls.Add(next);

            cell_1.Controls.Add(
new LiteralControl("&nbsp;&nbsp;"));
            cell_1.Controls.Add(PageTo);

            cell_1.Controls.Add(
new LiteralControl("&nbsp;"));
            cell_1.Controls.Add(page);

            cell_1.Controls.Add(
new LiteralControl("&nbsp;"));
            cell_1.Controls.Add(pagelabel);

            
#endregion;

            
return cell_1;
        }
        
#endregion

        
#region 数据源为空时

        
private Boolean _enableEmptyContentRender = true;

        
/// <summary>
        
/// 为空时输出内容
        
/// </summary>
        
/// <param name="writer"></param>
        protected virtual void RenderEmptyContent(System.Web.UI.HtmlTextWriter writer)
        {
            Table table 
= new Table();
            table.CopyBaseAttributes(
this);

            
#region  表头TR : 限制表头中无控件,隐藏列HeaderText需="";

            
//行 tr
            TableRow tr = new TableRow();

            
//显示原有表头th
            foreach (System.Web.UI.WebControls.DataControlField field in this.Columns)
            {
                
//lms中隐藏列的表头为空
                if (field.HeaderText != "")
                {
                    System.Web.UI.WebControls.TableHeaderCell cell 
= new System.Web.UI.WebControls.TableHeaderCell();
                    cell.Text 
= field.HeaderText;
                    tr.Cells.Add(cell);
                }
            }
            table.Rows.Add(tr);
            
#endregion

            
#region 内容行,样式 empty

            
//为空时 信息
            TableRow row = new TableRow();

            System.Web.UI.WebControls.TableCell msgCell 
= new System.Web.UI.WebControls.TableCell();

            
if (this.EmptyDataTemplate != null)
            {
                
this.EmptyDataTemplate.InstantiateIn(msgCell);
            }
            
else
            {
                
this.EmptyDataText = "暂无相关信息";//td
                msgCell.Text = this.EmptyDataText;
            }
            table.Rows.Add(row);

            msgCell.CssClass 
= "empty";
            msgCell.ColumnSpan 
= this.Columns.Count;
            row.Cells.Add(msgCell);
            
#endregion

            table.CssClass 
= this.CssClass;//样式的继承
            table.RenderControl(writer);
        }

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

            }
        }
        
#endregion

    }

 

效果图如下

posted @ 2010-03-22 11:23  树上有鱼  阅读(163)  评论(0)    收藏  举报