zoukankan      html  css  js  c++  java
  • 分页的一些汇总

    说到分页最基本的就是要计算起始位置。和分页数。这里总结一下。有的自己尝试过。有的来自网络。

    1:常用的方法

    pageIndex:当前页码

    pageSize:每页显示的记录数

    pageCount:总页数

    计算起始位置:

    int start (pageIndes-1)*pageSize+1;

    int end = pageIndex*pageSize;

    计算总页数

    int pageCount = Convert.ToInt32(Math.Ceiling((double)coun/pageSize)); //coun为总记录数

    2:这样你也可以试试

         $curr_index, 当前页码.

       $link_count, 链接数量.

      $page_count, 当前的数据的总页数.

       $start, 显示时的起始页码.

       $end, 显示时的终止页码.

         start = Math.max(1, curr_index - parseInt(link_count/2));

      end = Math.min(page_count, start + link_count - 1);

      start = Math.max(1, end - link_count + 1);

    看看分页存储过程

    ALTER PROCEDURE [dbo].[Pro_GetPagedList]
        @start int,
        @end int,
        @category int=0,
        @order    nvarchar(20)='id'
    AS
    BEGIN
    
        SET NOCOUNT ON;
    
        declare @sql nvarchar(1000)
        
        
        
        set @sql = 'select * from (select *,Row_Number() over(order by '+@order+ ' ) rownumber from books where CategoryId=1) t'
        + ' where t.rownumber>='+Convert(nvarchar(10),@start)+' and t.rownumber<='+Convert(nvarchar(10),@end)
        --EXEC (@sql)
        --EXEC SP_EXECUTESQL @sql
        EXEC (@sql)
    
        set Nocount off;
    END
    USE [bb]
    GO
    /****** Object:  StoredProcedure [dbo].[Pro_Page]    Script Date: 08/11/2013 16:50:53 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER PROCEDURE [dbo].[Pro_Page]
    (
    @tblName   varchar(255),       -- 表名
    
    @strGetFields varchar(1000) = '*',  -- 需要返回的列 
    
    @fldName varchar(255)='',      -- 排序的字段名
    
    @PageSize   int = 40,          -- 页尺寸
    
    @PageIndex  int = 1,           -- 页码
    
    @doCount  bit = 0,   -- 返回记录总数, 非 0 值则返回
    
    @OrderType bit = 0,  -- 设置排序类型, 非 0 值则降序
    @strWhere  varchar(1500)=''  -- 查询条件 (注意: 不要加 where)
    )
    AS
    
    declare @strSQL   varchar(5000)       -- 主语句
    
    declare @strTmp   varchar(110)        -- 临时变量
    
    declare @strOrder varchar(400)        -- 排序类型
    
     
    
    if @doCount != 0
    
      begin
    
        if @strWhere !=''
    
        set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
    
        else
    
        set @strSQL = 'select count(*) as Total from ' + @tblName 
    
    end  
    
    --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
    
    else
    
    begin
    
     
    
    if @OrderType != 0
    
    begin
    
        set @strTmp = '<(select min'
    
    set @strOrder = ' order by ' + @fldName +' desc'
    
    --如果@OrderType不是0,就执行降序,这句很重要!
    
    end
    
    else
    
    begin
    
        set @strTmp = '>(select max'
    
        set @strOrder = ' order by ' + @fldName +' asc'
    
    end
    
     
    
    if @PageIndex = 1
    
    begin
    
        if @strWhere != ''   
    
        set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
    
         else
    
         set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '+ @tblName + ' '+ @strOrder
    
    --如果是第一页就执行以上代码,这样会加快执行速度
    
    end
    
    else
    
    begin
    
    --以下代码赋予了@strSQL以真正执行的SQL代码
    
    set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '  from '
    
        + @tblName + ' where ' + @fldName + '' + @strTmp + '('+ @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' '

    + @fldName + ' from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder if @strWhere != '' set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @fldName + '' + @strTmp + '(' + @fldName + ') from (select top ' + str((@PageIndex-1)*@PageSize) + ' ' + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder end end exec (@strSQL)

    订单存储过程

    USE [bb]
    GO
    /****** Object:  StoredProcedure [dbo].[usp_CreateOrder]    Script Date: 08/11/2013 16:47:20 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    ALTER PROCEDURE [dbo].[usp_CreateOrder]
        -- Add the parameters for the stored procedure here
        @OrderNum nvarchar(30),--订单号
        @UserId int,   --userid
        @Address nvarchar(255), --传一个地址
        @totalMoney money output --返回一个总金额
    AS
    BEGIN    
        SET NOCOUNT ON;
        
        declare @error int --记录事务中的每一个sql语句是否都执行成功
    
        
        --计算该用户订单的总价格
        select @totalMoney=sum([count]*unitprice) from cart
        join books on cart.bookid=books.id
        where userid=@UserId
        
        
        --当用户调用这个存储过程时,购物车中没有书则求总价格为null
        if (@totalMoney is null)
        begin
            raiserror ('购物车为空',18,1)
            return
        end
        
        set @error=0
        begin transaction    
        --生成主表(表头)
        insert into orders(OrderId, OrderDate, UserId, TotalPrice, PostAddress, [state])
        values(@OrderNum,GetDate(),@UserId,@totalMoney,@Address,0)
        set @error=@error+@@error  --记录上面一句sql语句是否执行成功
        
        --插入明细表(表身)
        insert into orderbook(OrderID, BookID, Quantity, UnitPrice)
        select @OrderNum,BookId,[Count],unitprice  from cart join books on cart.bookid=books.id
        where UserId=@UserId
        set @error=@error+@@error  --记录上面一句sql语句是否执行成功
        
        --清空该用户的购物车
        delete from cart where UserId=@UserId
        set @error=@error+@@error  --记录上面一句sql语句是否执行成功
        
        --检测事务中的sql语句有没有出错的
        if (@error=0)
        begin
        --都执行成功了
            commit transaction
        end
        else
        begin
            rollback transaction
            raiserror('生成订单时出错.',18,1)
        end
        
    USE [bb]
    GO
    /****** Object:  StoredProcedure [dbo].[Pro_OrderCreate]    Script Date: 08/11/2013 16:47:18 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    -- Author:        <Author,,Name>
    -- Create date: <Create Date,,>
    -- Description:    <Description,,>
    -- =============================================
    ALTER PROCEDURE [dbo].[Pro_OrderCreate]
        @OrderNmber nvarchar(50),
        @UserId int,
        @Address nvarchar(255),
        @TotalMoney money output
    AS
    BEGIN
        -- SET NOCOUNT ON added to prevent extra result sets from
        -- interfering with SELECT statements.
        SET NOCOUNT ON;
        declare @error int;--用于记录事务中的每一个sql语句是否执行成功
        set @error=0;    
        
        SELECT @TotalMoney=sum(unitprice*count) from cart join books on cart.bookid=books.id
         where userid=@UserId
         
         if (@TotalMoney is null)
         begin
         --说明该用户在当前购物车中就没有定单
         raiserror ('购物车中没有图书',18,18)
         return;     
         end
         
         
         
         
         --下面开始生成定单
         --开始一个事务
         begin transaction--开启一个事务
         --插入表头     
         insert into orders (OrderId,OrderDate,UserId,TotalPrice,PostAddress,state)
         values(@OrderNmber,getdate(),@UserId,@TotalMoney,@Address,0)
         set @error=@error+@@error;--检测上一句sql语句是否出错
         
         --插入表身
         insert into OrderBook
         select @OrderNmber,BookId,[Count],UnitPrice  from cart join Books on  cart.bookid=books.id where UserId=@UserId
         set @error=@error+@@error;--检测上一句sql语句是否出错
         
         delete from cart where UserId=@UserId;
         set @error=@error+@@error;--检测上一句sql语句是否出错
         
         if (@error>0)--说明在这个事务中有某个sql语句出错了我们需要回滚
         begin
            rollback transaction
            raiserror ('生成定单时出错',18,18)
            return;
         end
         else
         begin
            commit transaction
         end
        SET NOCOUNT OFF;
    
        -- Insert statements for procedure here
        
    END

    分页 这里只有关键代码。没有样式。

     //params:
            //currentPage:当前页面, pageCount:总页数
            function createPageBar(currentPage, pageCount) {
                var start = currentPage - 5; //表示起始位置.
    
                if (start <= 1) { start = 1; }
    
                var end = start + 10; //求出终止位置。
                if (end >= pageCount) {
                    end = pageCount;
                    start = pageCount - 10 < 1 ? 1 : pageCount - 10; //注意:
                }
    
    
                var $html = "";
    
                //添加上一页
                if (currentPage > 1) $html += '<li class="last"><span class="page_live">上一页</span></li>';
                else  $html += '<li class="last"><span>上一页</span></li>';
    
    
                //前缀
                if (start == 2) {
                    $html += '<li><span class="page_live">1</span></li>';
                    //$html += '<li><span name="pa" style="border:none;">...</span></li>';
                }
                else if (start > 2) {
                    $html += '<li><span class="page_live">1</span></li>';
                    $html += '<li><span name="pa" style="border:none;">...</span></li>';
                }
    
                for (var i = start; i <= end; i++) {
                    if (i == currentPage) {//如果等于当前页码,则需要选中
    
                        $html += '<li><span class="page_active">' + i + '</span></li>';
                    }
                    else {
                        $html += '<li><span class="page_live">' + i + '</span></li>';
                    }
                }
    
                //后缀
                if (end != pageCount) {
                    $html += '<li><span name="pa" style="border:none;">...</span></li>';
                    $html += '<li><span class="page_live">' + pageCount + '</span></li>';
                }
                //添加下一页
                if (currentPage < pageCount) $html += '<li class="next"><span class="page_live">下一页</span></li>';
                else $html += '<li class="next"><span>下一页</span></li>';
    
                //$html += '<li class="next"><span class="page_live">下一页</span></li>';
                $html += '<li class="next"> 5条/页 共 '+m.pageData+'条</li>';
                $("#pageC").html($html);
            }

    点击上一页 下一页 以及数字  代码

      //分页 边框 样式
            function binPage() {
                /*
                $(".page_live").hover(
                function () { $(this).css({ "border": "1px solid #FE7002", "color": "#FF6600" }); },
                function () { $(this).css({ "border": "", "color": "" }); });
                */
    
                $(".page_live").live({
                    mouseenter: function () { if ($(this).hasClass("page_live")) { $(this).css({ "border": "1px solid #FE7002", "color": "#FF6600" }); } },  //鼠标进入
                    mouseleave: function () { $(this).css({ "border": "", "color": "" }); },  //鼠标离开
                    click: function () {  //鼠标单击
                        //var pageIndex = $.trim($(this).text());
                        var pageText = $.trim($(this).text());
                        //m.pageIndex = $(this).parent().index(); //获取li的index 即页码值 pageIndex
    
                        //$("#pageC li:not(:last)").each(function () { $(this).find("span").attr("d", "90"); });
                        //m.pageIndex = $.trim($("#pageC span[class=page_active]").text());
                        switch (pageText) {
                            case "上一页":
                                $(".pagemb8 li").last().find("span").addClass("page_live");  //启用'下一页'可单击
                                $("#pageC span[class=page_active]").attr("class", "page_live").parent().prev().find("span[name!=pa]").attr("class", "page_active").css({ "border": "", "color": "" });
                                if ($.trim($("#pageC span[class=page_active]").text()) == "1") //判断是否是第一页
                                    $(".pagemb8 li").first().find("span").removeClass("page_live").css({ "border": "", "color": "" }); //已经是最后一页。则不能在单击
                                break;
                            case "下一页":
                                //判断是否是最后一页
                                $(".pagemb8 li:eq(0)").find("span").addClass("page_live");
                                $("#pageC span[class=page_active]").attr("class", "page_live").parent().next().find("span[name!=pa]").attr("class", "page_active");
                                if ($.trim($("#pageC span[class=page_active]").text()) == m.pageCount)
                                    $(".pagemb8 li").last().find("span").removeClass("page_live").css({ "border": "", "color": "" }); //已经是最后一页。则不能在单击
                                m.pageIndex = m.pageIndex + 1;
                                break;
                            default:
                                $("#pageC li").find("span[name!=pa]").attr("class", "page_live");
                                $(this).attr("class", "page_active").css({ "border": "", "color": "" });
                                if (pageText == "1")
                                    $(".pagemb8 li:eq(0)").find("span").removeClass("page_live"); //已经是第一页。则不能在单击
                                else if (pageText == m.pageCount) {
                                    $(".pagemb8 li").last().find("span").removeClass("page_live"); //已经是最后一页。则不能在单击
                                }
                                break;
    
                        }
                        m.pageIndex = $.trim($("#pageC span[class=page_active]").text()); //保存页码
    
                        //当达到六页时,开始显示省略号
                        //                    if (m.pageIndex == 6) {
                        //                        if ($("#slh").length == 0)
                        //                            $("#pageC li:eq(2)").before("<li id='slh'><span style='border:none;' name='pa'>...</span></li>");
                        //                    }
                        //else if(m.pageIndex
                        //ckPage(m.pageIndex);
                        createPageBar(m.pageIndex, m.pageCount);
                        var t = $.trim($(".shuru").val());
                        var data = getData();
                        PageClick(m.pageIndex, 1, data); //开始加载数据
    
                        //PageClick(m.pageIndex, 0, t); //开始加载数据
                    }
                });
            }


    结果。如图

  • 相关阅读:
    GOF23设计模式之适配器模式(Adapter)
    浅谈浅克隆(shallow clone)和 深克隆(deep clone)
    GOF23设计模式之原型模式(prototype)
    GOF23设计模式之建造者模式(builder)
    GOF23设计模式之工厂模式(factory)
    GOF23设计模式之单例模式(singleton)
    面向对象设计的六大基本原则
    day38 各种队列、Event事件、协程、猴子补丁
    day37 GIL、同步、异步、进程池、线程池、回调函数
    day36 joinablequeue、多线程理论、多线程的两种使用方式、守护线程、互斥锁、死锁、递归锁、信号量
  • 原文地址:https://www.cnblogs.com/nsky/p/3251640.html
Copyright © 2011-2022 走看看