牛腩购物小结之: anpnetpager分页控件的使用图文教程,anpnetpager分页多表查询

分页控件的使用

一:下载,并在 vs2010 里面添加  anpnetpager 控件

1:  下载   http://www.webdiyer.com/Controls/AspNetPager/Downloads 下载

image

2:   将 AspNetPager.dll 和 AspNetPager.xml 考入到项目的 bin 文件夹 并在Bin文件夹上引用AspNetPager。(这一步其实可以用不,执行下面的第三部,就会把第二步执行一次的,不过这个 xml 好像不会自动考进来,所以我们还是把第一步 执行比较好)

 image 拷贝到 web层的Bin文件夹,并引用。

 

3:在VS2010 工具栏上面,右键新建项,然后找到刚才 bin文件的 AspNetPager.dll ,这样在工具栏就可以使用 AspNetPager了,将控件拖到你需要分页的地方,就可以了。

image image

然后就可以在工具栏看到 AspNetPager 控件了

image

 

二: 下面开始如何分页的步骤

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个参数的

image

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;
        }
posted @ 2012-03-27 15:00  asp_net老友记  阅读(341)  评论(0编辑  收藏  举报