分页控件的使用
一:下载,并在 vs2010 里面添加 anpnetpager 控件
1: 下载 http://www.webdiyer.com/Controls/AspNetPager/Downloads 下载
2: 将 AspNetPager.dll 和 AspNetPager.xml 考入到项目的 bin 文件夹 并在Bin文件夹上引用AspNetPager。(这一步其实可以用不,执行下面的第三部,就会把第二步执行一次的,不过这个 xml 好像不会自动考进来,所以我们还是把第一步 执行比较好)
3:在VS2010 工具栏上面,右键新建项,然后找到刚才 bin文件的 AspNetPager.dll ,这样在工具栏就可以使用 AspNetPager了,将控件拖到你需要分页的地方,就可以了。
然后就可以在工具栏看到 AspNetPager 控件了
二: 下面开始如何分页的步骤
1:分页控件的准备,我们上面已经做好了
2:在sql2005以及以上,运行分页的存储过程
-- ============================================= -- Author: 牛腩 -- Create date: 2009-07-22 12:41 -- Description: 分页,用到了ROW_NUMBER() -- ============================================= ALTER PROCEDURE [dbo].[proc_FenYe] @tblName varchar (255), -- 表名 @strGetFields varchar (1000) = ' * ', -- 需要返回的列,默认* @strOrder varchar (255)=' ', -- 排序的字段名,必填 @strOrderType varchar (10)=' ASC ', -- 排序的方式,默认ASC @PageSize int = 10, -- 页尺寸,默认10 @PageIndex int = 1, -- 页码,默认1 @strWhere varchar (1500) = ' ' -- 查询条件 (注意: 不要加 where) AS declare @strSQL varchar (5000) if @strWhere !=' ' set @strWhere=' where '+@strWhere set @strSQL= ' SELECT * FROM ( '+ ' SELECT ROW_NUMBER() OVER (ORDER BY '+@strOrder+' '+@strOrderType+' ) AS pos, '+@strGetFields+' '+ ' FROM '+@tblName+' '+@strWhere+ ' ) AS sp WHERE pos BETWEEN '+str((@PageIndex-1)*@PageSize+1)+' AND '+str(@PageIndex*@PageSize) exec (@strSQL)
注意:如果用到多表查询,还是使用上面的这个存储过程,下面是在sqlserver 2005 中的查询分析器中调用 上面的存储过程来进行多表查询
//这里是在存储过程里面的调用方法,可以使用多表查询的。 EXEC [proc_ShowPage] @tblName = N' (project p inner join projectca ca on p.caid=ca.id) ', @strGetFields = N' p.title,ca.caname ', @strOrder = N' p.id ', @strOrderType = N' desc ', @PageSize = 12, @PageIndex = 1, @strWhere = N' '
2:在页面上需要使用分页控件的地方,拉入控件,修改 上一页,下一页,尾页和首页的文字,设置为一直显示。
<webdiyer:AspNetPager ID=" anp " runat=" server " AlwaysShow=" True " FirstPageText=" 首页 " LastPageText=" 尾页 " NextPageText=" 下一页 " PrevPageText=" 上一页 " CustomInfoHTML=" 总计%RecordCount%条记录,共%PageCount%页,每页%PageSize%条 " ShowCustomInfoSection=" Left " CssClass=" paginator " CurrentPageButtonClass=" cpb " CustomInfoSectionWidth=" " >
然后设置它的CSS,使用拍拍网的样式
.paginator { font : 11px Arial, Helvetica, sans-serif ; padding : 10px 20px 10px 0 ; margin : 0px ;} .paginator a { padding : 1px 6px ; border : solid 1px #ddd ; background : #fff ; text-decoration : none ; margin-right : 2px } .paginator a:visited { padding : 1px 6px ; border : solid 1px #ddd ; background : #fff ; text-decoration : none ;} .paginator .cpb { padding : 1px 6px ; font-weight : bold ; font-size : 13px ; border : none } .paginator a:hover { color : #fff ; background : #ffa501 ; border-color : #ffa501 ; text-decoration : none ;}
然后给 anp控件加上 属性设置: CssClass=" paginator " CurrentPageButtonClass=" cpb "
3:在分页控件上,双击 进入后台编写分页控件点击的代码(先是统计anp分页控件的所有的产品数,然后是给产品rep绑定)
Niunan.Shop.DAL. ProductDAO pro = new DAL. ProductDAO (); protected void Page_Load( object sender, EventArgs e) { //页面进入的时候,分页控件先统计总的条数,然后绑定产品 if (!Page.IsPostBack) { anp.RecordCount = pro.ClacCount(getCond()); BindRepPro(); } } //绑定产品 private void BindRepPro() { //这里获取产品的时候,是调用分页来调用。分页的个数由 anp.PageSize 控制 repNewPro.DataSource = pro.GetList( "*" , "id" , "desc" , anp.PageSize, anp.CurrentPageIndex, getCond()); repNewPro.DataBind(); } //获取条件 private string getCond() { string cond = "isxp=1" ; return cond; } //分页控件点击事件(实际上就是重新绑定产品) protected void anp_PageChanged( object sender, EventArgs e) { BindRepPro(); }
注释事项:
我们在写一般的存储过程/多表查询的时候,要记得,用 inner join 这个是个好习惯,因为我们一般的存储过程,要转换为 分页的查询的时候,有这个 inner join 就很明显的知道是查询哪几张表
假如我们在 ajax控件里面有用到分页控件,那么如果是 postback提交分页 ,则ajax有效(也就是url不会有动静,但是页面有修改), 如果是 url 分页 ,那么页面的url会跟着改变了,就会变成 page=2 这样。
更加详细的设置,参见下面2篇分页文章
1:牛腩新闻发布系统 http://www.cnblogs.com/1727050508/archive/2012/02/29/2373612.html
2:牛腩购物系统 http://www.cnblogs.com/1727050508/archive/2012/03/05/2379982.html
注意:1使用的分页函数是 只有3个参数的
2:使用的是 6个 参数的(实际存储过程需要7个参数,但是表名我们是手动在下面写了 shop_product)
/// <summary> 分页获取数据列表 /// /// </summary> /// <param name="strGetFields"> 选择的字段 </param> /// <param name="strOrder"> 排序字段 </param> /// <param name="strOrderType"> 排序类型 desc或者asc </param> /// /// <param name="PageSize"> 页面大小 </param> /// <param name="PageIndex"> 页索引 </param> /// <param name="strWhere"> 条件 </param> /// <returns></returns> public DataSet GetList( string strGetFields, string strOrder, string strOrderType, int PageSize, int PageIndex, string strWhere) { Database db = DatabaseFactory .CreateDatabase(); DbCommand dbCommand = db.GetStoredProcCommand( "proc_FenYe" ); db.AddInParameter(dbCommand, "tblName" , DbType .AnsiString, "shop_product" ); db.AddInParameter(dbCommand, "strGetFields" , DbType .AnsiString, strGetFields); db.AddInParameter(dbCommand, "PageSize" , DbType .Int32, PageSize); db.AddInParameter(dbCommand, "PageIndex" , DbType .Int32, PageIndex); db.AddInParameter(dbCommand, "strOrder " , DbType .String, strOrder); db.AddInParameter(dbCommand, "strOrderType" , DbType .String, strOrderType); db.AddInParameter(dbCommand, "strWhere" , DbType .AnsiString, strWhere); return db.ExecuteDataSet(dbCommand); } /// <summary> 获取总的记录数 /// /// </summary> /// <param name="strWhere"></param> /// <returns></returns> public int ClacCount( string strWhere) { string sql = "select count(1) from shop_product" ; if (! string .IsNullOrEmpty(strWhere)) { sql += " where " + strWhere; } Database db = DatabaseFactory .CreateDatabase(); DbCommand dbCommand = db.GetSqlStringCommand(sql); return int .Parse(db.ExecuteScalar(dbCommand).ToString()); }
3:在牛腩新闻发布系统的时候,使用过一次多表查询分页,但是是3个参数的,以后我们使用的时候,修改成多个参数即可
/// <summary>分页选择新闻 /// /// </summary> /// <param name="pageSize">页面大小</param> /// <param name="pageIndex">页索引</param> /// <param name="cond">条件(不用加where)</param> /// <returns></returns> public DataTable Select( int pageSize, int pageIndex, string cond) { //执行分页的存储过程 [proc_FenYe] DataTable dt = new DataTable(); string procname = " proc_FenYe "; SqlParameter[] paras = new SqlParameter[]{ new SqlParameter(" @tblName "," (news a inner join category b on a.caId=b.id and a.caId=b.id) " as object ), new SqlParameter(" @strGetFields "," a.id,a.title,a.caid,a.createtime,a.content,b.name " as object ), new SqlParameter(" @strOrder "," a.createtime " as object ), //通过time来排序 new SqlParameter(" @strOrderType "," desc " as object ), new SqlParameter(" @PageSize ",pageSize as object ), new SqlParameter(" @PageIndex ",pageIndex as object ), new SqlParameter(" @strWhere ",cond as object ) }; dt = new SQLHelper().ExecuteQuery(procname, paras, CommandType.StoredProcedure); return dt; }