zoukankan      html  css  js  c++  java
  • 牛腩购物小结之: 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;
            }
    
  • 相关阅读:
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) C. Constellation
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) B Guess the Permutation
    codeforces Wunder Fund Round 2016 (Div. 1 + Div. 2 combined) A Slime Combining(栈)
    在服务器IIS中添加新网站后打开网站需要用户名和密码时怎么办?
    简易通讯录
    先列出所有数据库,再删除其中一个数据库。
    数据库创建mysql_query($sql,$link)
    显示所有数据库 mysql_fetch_object()
    读取数据库数据
    PHP警告错误处理办法
  • 原文地址:https://www.cnblogs.com/iceicebaby/p/2419576.html
Copyright © 2011-2022 走看看