前段时间的项目中需要使用到分页控件,在网上找了不少,最终还是自己动手写一个,比较简单,后续功能以后再实现,现把代码及思路写下来,望大家批评指正。分页控件的分页形式大多分三种,一种是用URL传值,通过给页面指定QueryString传值当前页的索引;另一种类似于GridView里面的分页方式,通过改变内部的PageIndex分页;还有一种是两种方式都包含,那样功能比较强大,在此不做评论。用URL传值的方式,相当于每点击分页按钮,页面就跳转至一个新的页面,那么页面IsPostBack值每次都是False,如果页面上不需要输入查询条件,那当然是没有问题的,如果查询页面上面要输入一些查询条件,自然用URL传值就不太适用了,至少你得把你输入的查询条件传递到新的URL中。故此,我在做这个控件时用到了用PageIndex传值的方式。首先我用了一个分页的存储过程,代码如下:

这个存储过程的执行结果包括三个表,第一个为空表,第二个是查询的结果集,显示的行数为@pagesize设置的大小,第三个是总记录数

下面是分页控件的代码:

 

 

代码不用多解释,当页数为1时,无任何输出,记录为零时,显示无相关记录的提示,其它情况下输出一个Div 和一个Table,Div是为了样式控制方便而输出的。

下面是用C#代码调用上面分页存储过程的示例

 


        /// 数据分页
        
/// </summary>
        
/// <param name="cmdText">Sql语句</param>
        
/// <param name="curPage">当前为第几页</param>
        
/// <param name="pageSize">每页行数</param>
        
/// <param name="pageCount">返回的总页数</param>
        
/// <param name="rowCount">返回的总记录数</param>
        
/// <returns>返回数据表</returns>
        private DataTable PagerList(string cmdText, int curPage, int pageSize, out int rowCount)
        {
            SqlConnection con 
= new SqlConnection("server=.;database=dbname;user id=user;password=password");
            DataSet ds 
= new DataSet();
            SqlDataAdapter da 
= new SqlDataAdapter("sp_PageList", con);
            da.SelectCommand.CommandType 
= CommandType.StoredProcedure;
            SqlParameter[] paras 
= new SqlParameter[]
            {
               
new SqlParameter("@sqlstr",SqlDbType.NVarChar,4000),
               
new SqlParameter("@currentpage",SqlDbType.Int),
               
new SqlParameter("@pagesize",SqlDbType.Int)
            };

            paras[
0].Value = cmdText;
            paras[
1].Value = curPage;
            paras[
2].Value = pageSize;

            
foreach (SqlParameter para in paras)
            {
                da.SelectCommand.Parameters.Add(para);
            }
            
try
            {
                con.Open();
                da.Fill(ds);
                con.Close();
            }
            
catch(Exception ex)
            {
                
throw new Exception(ex.Message);
            }

            rowCount 
= Convert.ToInt32(ds.Tables[2].Rows[0][0]);
            
return ds.Tables[1];
        }

public DataTable GetLog(int curPage, int pageSize, out int rowCount)
        {
           
return this.PagerList("select *from tb_Log",curPage,pageSize,out rowCount);
       }

 

之后便是将控件拖到页面上,设置PageSize值 绑定数据表到数据控件上

 

 BindGrid()
        {
            int recordCount =0;
            GridView1.DataSource 
= this.GetLog(Pager1.PageIndex + 1, Pager1.PageSize,out recordCount);
            GridView1.DataBind();

            Pager1.RecordCount 
= recordCount;
        }
/// <summary>
        
/// 分页控件的分页事件
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
protected void Pager1_PageIndexChanged(object sender, EventArgs e)
        {
            
this.BindGrid();
        }

 

至此,该控件从编码到测试就完成了,测试的代码需要大家根据实际环境去调正一下才能运行,总结一下,这个分页控件对数据源、数据绑定控件都不关心,它要做的是传递给数据源当前页的索引值,分页大小,然后接受数据源传递过来的总记录数,至于数据绑定控件,GridView,DataList,Repeater都可以使用这个分页控件。

相关文章:

  • 2022-12-23
  • 2021-11-16
  • 2021-11-11
  • 2022-02-21
猜你喜欢
  • 2021-07-02
  • 2021-11-03
  • 2022-12-23
  • 2021-11-26
  • 2021-07-18
  • 2021-08-15
相关资源
相似解决方案