使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
2009-02-28 14:40
851 查看
分页原来可以如此简单:
一、分页存储过程
1CREATE PROC sp_PageView
14@tbname sysname, --要分页显示的表名
15@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
16@PageCurrent int=1, --要显示的页码
17@PageSize int=10, --每页的大小(记录数)
18@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
19@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC,用于指定排序顺序
20@Where nvarchar(1000)='', --查询条件
21@ItemCount int OUTPUT,
22@PageCount int OUTPUT --总页数
23AS
24SET NOCOUNT ON
25--检查对象是否有效
26IF OBJECT_ID(@tbname) IS NULL
27BEGIN
28 RAISERROR(N'对象"%s"不存在',1,16,@tbname)
29 RETURN
30END
31IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
32 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
33 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
34BEGIN
35 RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
36 RETURN
37END
38--分页字段检查
39IF ISNULL(@FieldKey,N'')=''
40BEGIN
41 RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
42 RETURN
43END
44--其他参数检查及规范
45IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
46IF ISNULL(@PageSize,0)<1 SET @PageSize=10
47IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
48IF ISNULL(@FieldOrder,N'')=N''
49 SET @FieldOrder=N''
50ELSE
51 SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
52IF ISNULL(@Where,N'')=N''
53 SET @Where=N''
54ELSE
55 SET @Where=N'WHERE ('+@Where+N')'
56--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
57
58 DECLARE @sql nvarchar(4000)
59 SET @sql=N'SELECT @ItemCount=COUNT(*)'
60 +N' FROM '+@tbname
61 +N' '+@Where
62 EXEC sp_executesql @sql,N'@ItemCount int OUTPUT',@ItemCount OUTPUT
63 SET @PageCount=(@ItemCount+@PageSize-1)/@PageSize
64
65print @PageCount
66print @ItemCount
67--计算分页显示的TOPN值
68DECLARE @TopN varchar(20),@TopN1 varchar(20)
69SELECT @TopN=@PageSize,
70 @TopN1=(@PageCurrent-1)*@PageSize
71--第一页直接显示
72IF @PageCurrent=1
73 EXEC(N'SELECT TOP '+@TopN
74 +N' '+@FieldShow
75 +N' FROM '+@tbname
76 +N' '+@Where
77 +N' '+@FieldOrder)
78ELSE
79BEGIN
80 --处理别名
81 IF @FieldShow=N'*'
82 SET @FieldShow=N'a.*'
83 --生成主键(惟一键)处理条件
84 DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
85 @s nvarchar(1000),@Field sysname
86 SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
87 WHILE CHARINDEX(N',',@s)>0
88 SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
89 @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
90 @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
91 @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
92 --@Where=REPLACE(@Where,@Field,N'a.'+@Field),
93 @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
94 @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
95 SELECT --@Where=REPLACE(@Where,@s,N'a.'+@s),
96 @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
97 @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
98 @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
99 @Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'
DECLARE @QUERYSTRING varchar(2000)
SET @QUERYSTRING = N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder
PRINT @QUERYSTRING
--执行查询
EXEC(@QUERYSTRING)
END
GO
二、需要分页的用户控件基类(里面还有一些信息提示的功能):
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web.UI;
5using System.Web.UI.WebControls;
6using Wuqi.Webdiyer;
7
8namespace Foundway.Project.Web
9
三、需要分页的用户控件前台代码:
1
3记录列表
4<asp:DivLabel ID="labelMsg" runat="server"></asp:DivLabel>
5<asp:Repeater id="repeaterItem" runat="server">
6 <HeaderTemplate><table>
7 <tr>
8 <th>序号</th>
9 <th>名称</th>
</tr>
</HeaderTemplate>
<FooterTemplate></table></FooterTemplate>
<ItemTemplate>
<tr>
</tr>
</ItemTemplate>
</asp:Repeater>
<asp:AspNetPager ID="pagerBottom" runat="server" OnPageChanged="OnPageChanged" />
四、需要分页的用户控件后台代码:
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web.UI.WebControls;
5using System.Data;
6using Foundway.Project.Data.Sql;
7
8namespace GotAspx.Sample.Facade.Controls
9
好,大功告成了。这个用户控件,在Aspx里调用的时候,还可以加参数,比如页大小,条件,排序等。
<uc:ItemPageList ID="list" runat="server" PageSize="20" OrderBy="Id Desc" Where="Id < 200 and AddTime < getdate()" />
一、分页存储过程
1CREATE PROC sp_PageView
14@tbname sysname, --要分页显示的表名
15@FieldKey nvarchar(1000), --用于定位记录的主键(惟一键)字段,可以是逗号分隔的多个字段
16@PageCurrent int=1, --要显示的页码
17@PageSize int=10, --每页的大小(记录数)
18@FieldShow nvarchar(1000)='', --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
19@FieldOrder nvarchar(1000)='', --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC,用于指定排序顺序
20@Where nvarchar(1000)='', --查询条件
21@ItemCount int OUTPUT,
22@PageCount int OUTPUT --总页数
23AS
24SET NOCOUNT ON
25--检查对象是否有效
26IF OBJECT_ID(@tbname) IS NULL
27BEGIN
28 RAISERROR(N'对象"%s"不存在',1,16,@tbname)
29 RETURN
30END
31IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
32 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
33 AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
34BEGIN
35 RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
36 RETURN
37END
38--分页字段检查
39IF ISNULL(@FieldKey,N'')=''
40BEGIN
41 RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
42 RETURN
43END
44--其他参数检查及规范
45IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
46IF ISNULL(@PageSize,0)<1 SET @PageSize=10
47IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
48IF ISNULL(@FieldOrder,N'')=N''
49 SET @FieldOrder=N''
50ELSE
51 SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
52IF ISNULL(@Where,N'')=N''
53 SET @Where=N''
54ELSE
55 SET @Where=N'WHERE ('+@Where+N')'
56--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
57
58 DECLARE @sql nvarchar(4000)
59 SET @sql=N'SELECT @ItemCount=COUNT(*)'
60 +N' FROM '+@tbname
61 +N' '+@Where
62 EXEC sp_executesql @sql,N'@ItemCount int OUTPUT',@ItemCount OUTPUT
63 SET @PageCount=(@ItemCount+@PageSize-1)/@PageSize
64
65print @PageCount
66print @ItemCount
67--计算分页显示的TOPN值
68DECLARE @TopN varchar(20),@TopN1 varchar(20)
69SELECT @TopN=@PageSize,
70 @TopN1=(@PageCurrent-1)*@PageSize
71--第一页直接显示
72IF @PageCurrent=1
73 EXEC(N'SELECT TOP '+@TopN
74 +N' '+@FieldShow
75 +N' FROM '+@tbname
76 +N' '+@Where
77 +N' '+@FieldOrder)
78ELSE
79BEGIN
80 --处理别名
81 IF @FieldShow=N'*'
82 SET @FieldShow=N'a.*'
83 --生成主键(惟一键)处理条件
84 DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
85 @s nvarchar(1000),@Field sysname
86 SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
87 WHILE CHARINDEX(N',',@s)>0
88 SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
89 @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
90 @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
91 @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
92 --@Where=REPLACE(@Where,@Field,N'a.'+@Field),
93 @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
94 @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
95 SELECT --@Where=REPLACE(@Where,@s,N'a.'+@s),
96 @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
97 @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
98 @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),
99 @Where2=CASE
WHEN @Where='' THEN N'WHERE ('
ELSE @Where+N' AND ('
END+N'b.'+@s+N' IS NULL'+@Where2+N')'
DECLARE @QUERYSTRING varchar(2000)
SET @QUERYSTRING = N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' a LEFT JOIN(SELECT TOP '+@TopN1
+N' '+@FieldKey
+N' FROM '+@tbname
+N' a '+@Where
+N' '+@FieldOrder
+N')b ON '+@Where1
+N' '+@Where2
+N' '+@FieldOrder
PRINT @QUERYSTRING
--执行查询
EXEC(@QUERYSTRING)
END
GO
二、需要分页的用户控件基类(里面还有一些信息提示的功能):
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web.UI;
5using System.Web.UI.WebControls;
6using Wuqi.Webdiyer;
7
8namespace Foundway.Project.Web
9
三、需要分页的用户控件前台代码:
1
3记录列表
4<asp:DivLabel ID="labelMsg" runat="server"></asp:DivLabel>
5<asp:Repeater id="repeaterItem" runat="server">
6 <HeaderTemplate><table>
7 <tr>
8 <th>序号</th>
9 <th>名称</th>
</tr>
</HeaderTemplate>
<FooterTemplate></table></FooterTemplate>
<ItemTemplate>
<tr>
</tr>
</ItemTemplate>
</asp:Repeater>
<asp:AspNetPager ID="pagerBottom" runat="server" OnPageChanged="OnPageChanged" />
四、需要分页的用户控件后台代码:
1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web.UI.WebControls;
5using System.Data;
6using Foundway.Project.Data.Sql;
7
8namespace GotAspx.Sample.Facade.Controls
9
好,大功告成了。这个用户控件,在Aspx里调用的时候,还可以加参数,比如页大小,条件,排序等。
<uc:ItemPageList ID="list" runat="server" PageSize="20" OrderBy="Id Desc" Where="Id < 200 and AddTime < getdate()" />
相关文章推荐
- 使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
- 使用AspNetPager分页控件、分页存储过程及用户控件基类实现的完美分页功能
- ASP.NET调用Oracle分页存储过程并结合ASPnetpager分页控件 实现分页功能
- asp.net下Repeater使用 AspNetPager分页控件 不用存储过程 完美实现
- AspNetPager控件分页(使用控件自动生成的存储过程)
- 1 用存储过程实现分页,除了上一页,下一页,第一页,和末页外还要有go按钮,以及go到那里的文本框。另外还要在Lable显示“当前x页,一共y页”。注意验证控件的使用和 链接存储过程的内容。
- asp.net结合aspnetpager使用SQL2005的存储过程分页(转)
- 自定义分页控件UI,从Discuz截取,配合SQL自定义分页存储过程一起使用
- 使用系统存储过程实现的通用分页存储过程
- sql分页存储过程!与asp.net分页控件一起使用
- SQL分页参数传值 在存储过程中使用 动态SQL实现
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 存储过程通过临时表来实现分页的功能
- 使用为公开的存储过程sp_cursoropen实现分页(转)
- ASP.NET中利用DataGrid的自定义分页功能和存储过程结合实现高效分页
- 使用PagedDataSource类实现DataList和Repeater控件的分页显示功能
- 存储过程 实现分页功能
- aspnetpager 分页存储过程的实现
- ASP.NET分页存储过程自定义用户控件
- ASP.NET分页存储过程自定义用户控件