标签:
本文转自:http://www.cnblogs.com/foolin/archive/2011/08/31/2161342.html
文章最后更新于2011年9月2日,增加Demo代码。
一般开发绑定数据的时候,Repeater控件是非常好用的控件,但是很多.net开发人员苦恼于无法分页,于是开发一个基于Repeater的分页控件,现在拿出来和大家一起分享分享。写得不好大家可以尽管拍砖,源码在本文后面。其实这个分页控件非常简单,分页控件只是根据记录数和当前页数等设置而输出一个分页导航条而已,并没有参与真正的分页,具体如何从数据库读取分页数据,还需自己编写存储过程或者sql来实现。废话少说,简单介绍一下控件的功能:
一、分页控件的属性:
---可显示设置属性
ID //分页控件ID(同页内必须唯一) (string)
CssClass // Css样式 (string)
ShowPreNext //是否显示上一页下一页 (bool)
ShowPageNum //是否显示页码连接 (bool)
PageSplitNum //页码隔多少数字 (int:当ShowPageNum属性为true时生效)
ShowPageTips //是否显示当前页、记录数等信息 (bool)
ShowPageJump //是否显示下来框跳转 (bool)
ShowPageGo //是否显示输入页码跳转 (bool)
ShowPageLan //显示语言的类型 (int: 0 - 默认, 1 - 中文, 2 - 英语)
---不可显示设置属性
PageSize //每页记录数(int)
PageIndex //当前页码(int)
PageTotal //总页数(int:只读)
Records //总记录数(int)
二、分页控件的方法:
void SetPage(int records);
------ 函数说明 ------
功能:初始化分页控件
参数:records - 总记录数
输出:无
三、控件使用说明:
1. 引用控件到项目中
把控件Ling.Pager.dll引入到项目中,也就是直接复制这个dll到站点的bin目录下。
2. 前台Aspx加入控件Page1
在前台aspx顶部加入代码:
<%@ Register Assembly="Ling.Pager" Namespace="Ling.Pager" TagPrefix="cc1" %>
接着在前台aspx页面需要插入分页条的位置(如Repeater的底部)插入代码:
<asp:Repeater ID="repList" runat="server">
<HeaderTemplate>
<table>
<tr>
<th>ID</th>
<th>地区</th>
<th>所属省份</th>
<th>拼音</th>
<th>区号</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%#Eval("AreaID") %></td>
<td><%#Eval("AreaName") %></td>
<td><%#Eval("Province") %></td>
<td><%#Eval("Area") %></td>
<td><%#Eval("RegionNO") %></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<cc1:Pager ID="Pager1" runat="server">
</cc1:Pager>
这样我们就把整个控件加入进去了。
3.后台绑定数据源及初始化控件
至于如何读取分页数据,建议用存储过程进行分页,给出一个支持多表查询(Left join等)的存储过程分页:
1 分页存储过程SQL 2 3 -- ============================================= 4 -- Foolin收集(来自网上,佚名) 5 -- Create date: 2010-09-22 6 -- Description: 存储过程分页,支持分页查询 7 -- 调用:(排序ASC不可少) 8 -- exec Wb_Page ‘select * from [YouTable] ‘, 20, 0, ‘CreateTime ASC, Money DESC‘ 9 -- ============================================= 10 CREATE PROCEDURE [dbo].[SP_Page] 11 ( 12 @Sql nvarchar(1024), --查询语句 13 @Sort nvarchar(100) = ‘‘, --排序字段 14 @PageSize int = 20, --分页大小 15 @PageIndex int = 1, --分页索引 16 @TotalCount int = 0 output --总数 17 ) 18 AS 19 20 -- 值默认值 21 if (IsNUll(@PageSize,0)=0) 22 Set @PageSize=20 23 if (IsNull(@PageIndex,0)=0) 24 Set @PageIndex=1 25 26 set nocount on 27 /*声明查询字符串*/ 28 declare @strSQL nvarchar(4000) 29 30 set @strSQL = ‘ select @TotalCount=count(*) from (‘+@Sql+‘) as t ‘ 31 32 /*取得查询结果总数*/ 33 exec sp_executesql 34 @strSQL, 35 N‘@TotalCount int=0 OUTPUT‘, 36 @TotalCount=@TotalCount OUTPUT 37 38 declare @ItemCount int 39 declare @_PageIndex int 40 41 set @_PageIndex = @PageIndex; --索引从1开始 42 --set @_PageIndex = @PageIndex + 1; --索引从0开始 43 44 /*确定搜索边界*/ 45 set @ItemCount = @TotalCount - @PageSize * @_PageIndex 46 47 if(@ItemCount < 0) 48 set @ItemCount = @ItemCount + @PageSize 49 else 50 set @ItemCount = @PageSize 51 52 if(@ItemCount < 0) return 1 53 54 if(@Sort != ‘‘) 55 begin 56 /*声明排序变量*/ 57 declare @IndexSort1 nvarchar(50), @IndexSort2 nvarchar(50), @Sort1 nvarchar(50), @Sort2 nvarchar(50) 58 59 SET @Sort1 = @Sort 60 SET @Sort2 = Replace(Replace(Replace(@Sort, ‘DESC‘, ‘@SORT‘), ‘ASC‘, ‘DESC‘), ‘@SORT‘, ‘ASC‘) 61 62 set @strSQL = ‘SELECT * FROM 63 (SELECT TOP ‘ + STR(@ItemCount) + ‘ * FROM 64 (SELECT TOP ‘ + STR(@PageSize * @_PageIndex) + ‘ * FROM 65 (‘+@Sql+‘) AS t0 66 ORDER BY ‘+@Sort1 +‘) AS t1 67 ORDER BY ‘+@Sort2 +‘) AS t2 68 ORDER BY ‘ +@Sort 69 end 70 else 71 begin 72 set @strSQL = ‘SELECT * FROM 73 (SELECT TOP ‘ + STR(@ItemCount) + ‘ * FROM 74 (SELECT TOP ‘ + STR(@PageSize * @_PageIndex) + ‘ * FROM 75 (‘+@Sql+‘) As t0) 76 aS t1) 77 AS t2‘ 78 end 79 80 exec sp_executesql 81 @strSQL
后台aspx.cs页面绑定Repeater数据源、初始化控件:
1 Demo后台处理代码 2 3 using System; 4 using System.Collections.Generic; 5 using System.Linq; 6 using System.Web; 7 using System.Web.UI; 8 using System.Web.UI.WebControls; 9 using System.Data; 10 using System.Data.SqlClient; 11 12 public partial class _Default : System.Web.UI.Page 13 { 14 15 private string connectionString = "server=(local)\\SQL2005;database=LingPager;uid=sa;pwd=123456 "; //数据库连接字符串 16 17 protected void Page_Load(object sender, EventArgs e) 18 { 19 if (!IsPostBack) 20 { 21 BindDataList(); 22 } 23 } 24 25 26 protected void BindDataList() 27 { 28 //string strSql = @"SELECT *, ‘--‘ AS Province FROM T_Area"; //普通SQL语句 29 string strSql = @" 30 SELECT A.AreaID, A.Area, A.AreaName, A.RegionNO, IsNull(B.AreaName,‘--‘) AS Province 31 FROM T_Area A 32 LEFT JOIN T_Area B 33 ON A.ParentID=B.AreaID 34 "; //多表查询SQL语句 35 36 //排序字段,必须,注意ASC不可以省略 37 string fieldOrder = "Province ASC"; 38 39 int records = 0; //总记录数 40 41 //绑定数据 42 repList.DataSource = GetDataList(strSql, fieldOrder, Pager1.PageSize, Pager1.PageIndex, out records); //读取数据源并绑定 43 repList.DataBind(); 44 45 //设置页面(必须) 46 Pager1.SetPage(records); //初始化分页条 47 48 49 /************ Pager属性设置(可选) *********/ 50 //Pager1.ShowPageJump = true; 51 Pager1.ShowPageGo = true; 52 Pager1.ShowPageLan = 0; //导航条语言:0=默认,1=中文,2=英语 53 //更多设置.... 54 /************ Pager 属性 *********/ 55 56 } 57 58 59 /// <summary> 60 /// 取数据接口 61 /// </summary> 62 /// <param name="strSql"></param> 63 /// <param name="fieldOrder"></param> 64 /// <param name="pageSize"></param> 65 /// <param name="pageIndex"></param> 66 /// <param name="records"></param> 67 /// <returns></returns> 68 public DataTable GetDataList(string strSql, string fieldOrder, int pageSize, int pageIndex, out int records) 69 { 70 DataTable dt = null; //返回的数据集 71 records = 0; //事先赋值 72 73 using (SqlConnection sqlConn = new SqlConnection(connectionString)) 74 { 75 //打开连接 76 sqlConn.Open(); 77 78 //初始化参数 79 80 81 SqlCommand sqlCmd = new SqlCommand(); 82 sqlCmd.Connection = sqlConn; 83 sqlCmd.CommandText = "SP_Page"; 84 sqlCmd.CommandType = CommandType.StoredProcedure; 85 86 #region ___存储过程参数___ 87 SqlParameter recordsParam = new SqlParameter("@TotalCount", SqlDbType.Int, 32); 88 recordsParam.Direction = ParameterDirection.Output; 89 //创建 90 sqlCmd.Parameters.Add(new SqlParameter("@Sql", SqlDbType.NVarChar, 1024)); 91 sqlCmd.Parameters.Add(new SqlParameter("@Sort", SqlDbType.NVarChar, 100)); 92 sqlCmd.Parameters.Add(new SqlParameter("@PageSize", SqlDbType.Int, 32)); 93 sqlCmd.Parameters.Add(new SqlParameter("@PageIndex", SqlDbType.Int, 32)); 94 sqlCmd.Parameters.Add(recordsParam); 95 //赋值 96 sqlCmd.Parameters[0].Value = strSql; 97 sqlCmd.Parameters[1].Value = fieldOrder; 98 sqlCmd.Parameters[2].Value = pageSize; 99 sqlCmd.Parameters[3].Value = pageIndex; 100 sqlCmd.Parameters[4].Direction = ParameterDirection.Output; 101 #endregion ___存储过程参数___ 102 103 //取数据 104 DataSet ds = new DataSet(); 105 SqlDataAdapter sda = new SqlDataAdapter(sqlCmd); 106 sda.Fill(ds); 107 if (ds != null && ds.Tables.Count > 0) 108 { 109 dt = ds.Tables[0]; 110 } 111 112 records = (int)recordsParam.Value; //返回记录数 113 114 //释放资源 115 if (sqlConn != null) 116 { 117 sqlConn.Close(); 118 sqlConn.Dispose(); 119 } 120 121 } 122 123 124 return dt; 125 } 126 127 }
源码下载:点击下载
本文转自:http://www.cnblogs.com/foolin/archive/2011/08/31/2161342.html
标签:
原文地址:http://www.cnblogs.com/KTblog/p/4279563.html