说到分页最基本的就是要计算起始位置。和分页数。这里总结一下。有的自己尝试过。有的来自网络。
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); //开始加载数据 } }); }
结果。如图