[原创]老生常谈,回顾并整理一下DataGrid分页控件

·摘要
           素材来自于最近完成的一个.net1.0项目。因为DataGrid自带的分页功能不够完善,所以自己写了个控件,用途是支持DataGrid的自定义分页,主要包含首页、上一页、下一页、尾页;任意跳转页;显示所有页数信息等。 这个分页控件可以提供给任何需要的DataGrid使用。

·设计思路
            为了让这个控件能够适用于每个页面,定义了一个接口ICurrentIndex,ICurrentIndex中定义了绑定方法BindData(),以及两个属性int CurrentIndex和int PageCount。这样,每个需要使用分页控件的页面,除了本身继承自Page外,还必须实现接口ICurrentIndex,而且实现绑定方法BindData()。 当然,如果你的用户控件仅仅给一个DataGrid使用,无须这么麻烦通过接口来实现。

以下就是效果图:
1.JPG

·如何使用
            1)当然把分页控件拉到页面上的DataGrid下面 了。DisplayPageNumber属性决定是显示下拉框还是任意输入,本文不做细节讨论。
None.gif<TR>
None.gif                    <TD><asp:datagrid id="DataGrid1" runat="server" Height="144px" Width="552px" AllowPaging="True" PageSize="5">
None.gif                            <PagerStyle Visible="False"></PagerStyle>
None.gif                        </asp:datagrid></TD>
None.gif                </TR>
None.gif                <TR>
None.gif                     <TD><uc1:navigation id="navigation" runat="server" DisplayPageNumber="false"></uc1:navigation></TD>
None.gif                </TR>

            2)在页面的CodeBehind(2.0中叫CodeFile)里,实现接口ICurrentIndex
None.gif public   class  _Default : System.Web.UI.Page, ICurrentIndex
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {……}

            3)实现接口中的BindData方法:public void BindData(),在这个方法中,实现绑定DataGrid之后,把DataGrid的页数PageCount(PageCount=(int)Math.Ceiling( 记录总数recordCount * 1.0 / DataGrid.PageSize);)作为参数,传给用户控件里的方法AddPageCount;同时把PageCount、PageSize、记录总数recordCount,以及DataGird的CurrentPageIndex作为参数传给分页控件的NavigationStateChange()方法。

None.gif/// <summary>
  /// BindDataGrid
  /// </summary>
  public void BindData()
  {
   DataTable dt = new DataTable();
   if(Session["datasource"] == null)
   {
    string cmdText = "SELECT top 26 ProductID,ProductName,QuantityPerUnit,UnitPrice FROM Products";
    dt = SQLHelper.FillDataTable(cmdText);

    Session["datasource"] = dt;
   }
   else
   {
    dt = (DataTable)Session["datasource"];
   }
   
   if(dt!= null  && dt.Rows.Count > 0)
   {
    this.recordCount = dt.Rows.Count;
    this.pageCount = (int)Math.Ceiling( this.recordCount * 1.0 / this.DataGrid1.PageSize);
   
    ViewState["RecordCount"] = this.recordCount;
    ViewState["PageCount"] = this.pageCount;

    this.DataGrid1.DataSource = dt.DefaultView;
    this.DataGrid1.DataBind();
   }
   else
   {
    this.DataGrid1.Visible = false;
   }

   this.navigation.AddPageCode(this.pageCount);
   this.navigation.NavigationStateChange(this.pageCount, this.DataGrid1.PageSize, this.recordCount, this.DataGrid1.CurrentPageIndex);
  }


            4)实现接口中的两个属性。
None.gif public   int  CurrentIndex
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this.DataGrid1.CurrentPageIndex;
ExpandedSubBlockEnd.gif            }

InBlock.gif            
set
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
this.DataGrid1.CurrentPageIndex = value;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

None.gif
None.gif        
public   int  PageCount
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
get
ExpandedSubBlockStart.gifContractedSubBlock.gif            
dot.gif{
InBlock.gif                
return this.pageCount;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }
   
         5)自此,页面部分的代码已经做完,不算复杂吧。下面开始看看用户控件中的代码:
            6)分页控件中的public void AddPageCode(int pageCount):把页码显示在下拉框中。
None.gif public   void  AddPageCode( int  pageCount)
ExpandedBlockStart.gifContractedBlock.gif        
dot.gif {
InBlock.gif            
if(this.displayPageNumber)//显示下拉框页码
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{
InBlock.gif                
this.txtPageNumber.Visible = false;
InBlock.gif                
this.btnGo.Visible = false;
InBlock.gif                
this.ddlPageIndex.Items.Clear();//先清除
InBlock.gif
                for(int i=1;i<= pageCount;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif                
dot.gif{
InBlock.gif                    
this.ddlPageIndex.Items.Add(i.ToString());
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif            
else//否则让用户自己输入页码
ExpandedSubBlockStart.gifContractedSubBlock.gif
            dot.gif{
InBlock.gif                
this.txtPageNumber.Visible = true;
InBlock.gif                
this.btnGo.Visible = true;
InBlock.gif                
this.ddlPageIndex.Visible = false;
ExpandedSubBlockEnd.gif            }

ExpandedBlockEnd.gif        }

            7)分页控件中的public void NavigationStateChange(int pageCount, int pageSize, int recordCount, int currentIndex)方法:根据传入的参数,控制导航按钮或数字的状态。
None.gif ///   < summary >
None.gif        
///  控制导航按钮或数字的状态
None.gif        
///   </ summary >
None.gif        public void NavigationStateChange(
int  pageCount ,   int  pageSize ,   int  recordCount ,   int  currentIndex)
None.gif        {
None.gif            this
. LtlPageCount . Text  =  pageCount . ToString();
None.gif            this
. LtlPageIndex . Text  =   " 1 " ;
None.gif            this
. LtlPageSize . Text  =  pageSize . ToString();
None.gif            this
. LtlRecordCount . Text  =  recordCount . ToString();
None.gif
None.gif            
if ( pageCount  <=   1  ) // ( RecordCount  <=  PageSize ) // 小于等于一页
None.gif            {
None.gif                this
. LBtnFirst . Enabled  =  false;
None.gif                this
. LBtnPrev . Enabled  =  false;
None.gif                this
. LBtnNext . Enabled  =  false;
None.gif                this
. LBtnLast . Enabled  =  false;
None.gif            }
None.gif            
else   // 有多页
None.gif            {
None.gif                
if ( currentIndex  ==   0  ) // 当前为第一页
None.gif                {
None.gif                    this
. LBtnFirst . Enabled  =  false;
None.gif                    this
. LBtnPrev . Enabled  =  false;
None.gif                    this
. LBtnNext . Enabled  =  true;
None.gif                    this
. LBtnNext . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnLast . Enabled  =  true;
None.gif                    this
. LBtnLast . ForeColor  =   System . Drawing . Color . Red;
None.gif                }
None.gif                
else   if (currentIndex  ==  pageCount  -   1  ) // 当前为最后页 
None.gif                {
None.gif                    this
. LBtnFirst . Enabled  =  true;
None.gif                    this
. LBtnFirst . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnPrev . Enabled  =  true;
None.gif                    this
. LBtnPrev . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnNext . Enabled  =  false;
None.gif                    this
. LBtnLast . Enabled  =  false;
None.gif                }
None.gif                
else   // 中间页
None.gif                {
None.gif                    this
. LBtnFirst . Enabled  =  true;
None.gif                    this
. LBtnFirst . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnPrev . Enabled  =  true;
None.gif                    this
. LBtnPrev . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnNext . Enabled  =  true;
None.gif                    this
. LBtnNext . ForeColor  =   System . Drawing . Color . Red;
None.gif                    this
. LBtnLast . Enabled  =  true;
None.gif                    this
. LBtnLast . ForeColor  =   System . Drawing . Color . Red;
None.gif                }                  
None.gif            }
None.gif
None.gif            
if (recordCount  ==   0 ) // 当没有纪录时DataGrid . PageCount会显示1页
None.gif                this
. LtlPageCount . Text  =   " 0 " ;
None.gif            
else
None.gif                this
. LtlPageCount . Text  =  pageCount . ToString();
None.gif            
if (recordCount  ==   0 )
None.gif                this
. LtlPageIndex . Text  =   " 0 " ;
None.gif            
else
None.gif                this
. LtlPageIndex . Text  =  (currentIndex  +   1 ) . ToString(); // 在有页数的情况下前台显示页数加1
None.gif            this
. LtlPageSize . Text  =  pageSize . ToString();
None.gif            this
. LtlRecordCount . Text  =  recordCount . ToString();
None.gif
None.gif            this
. ddlPageIndex . SelectedIndex  =  currentIndex;
None.gif        }

            8)控件中跳转控制代码:主要是设置DataGrid的CurrentIndex,并调用页面中的BindData()方法。
None.gif private void btnGo_Click(object sender ,   System . Web . UI . ImageClickEventArgs e)
None.gif        {
None.gif            
if (this . txtPageNumber . Text . Trim()  !=   "" )
None.gif            {
None.gif                
int   index   =  Convert . ToInt32(this . txtPageNumber . Text . Trim())  -   1 ;
None.gif                
if ( index   <   0 )
None.gif                {
None.gif                    
index   =   0 ;
None.gif                }
None.gif                
else   if ( index   >=  Convert . ToInt32(this . LtlPageCount . Text))
None.gif                {
None.gif                    
index   =  Convert . ToInt32(this . LtlPageCount . Text)  -   1 ;
None.gif                }
None.gif                this
. txtPageNumber . Text  =  ( index   +   1 ) . ToString();
None.gif                this
. iParent . CurrentIndex  =   index ;
None.gif                this
. iParent . BindData();
None.gif            }
None.gif            
else
None.gif            {
None.gif                this
. iParent . BindData();
None.gif                
return ; // this . RegularExpressionValidator1 . IsValid  =  false;
None.gif            }
None.gif        }

完整代码下载: http://www.cnblogs.com/Files/lxinxuan/DataGridPager.rar

转载于:https://www.cnblogs.com/lxinxuan/archive/2007/04/19/719866.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值