[原]ASP.NET(C#)Repeater分页控件(含源码)

    一般开发绑定数据的时候,Repeater控件是非常好用的控件,但是很多.net开发人员苦恼于无法分页,于是开发一个基于Repeater的分页控件,现在拿出来和大家一起分享分享。写得不好大家可以尽管拍砖,源码在本文后面。其实这个分页控件非常简单,分页控件只是根据记录数和当前页数等设置而输出一个分页导航条而已,并没有参与真正的分页,具体如何从数据库读取分页数据,还需自己编写存储过程或者sql来实现。废话少说,简单介绍一下控件的功能:
  • ·支持数字分页
  • 支持分页下拉框
  • 支持输入跳转分页
  • 同一个页面支持多个分页。
  • 支持默认、中文、英文等模式使用。
  • 内含漂亮且简洁的Css样式。
  • 可自定义Css样式。
  • 虽为Repeater开发的,但不局限于Repeater,也适用于其它数据绑定控件!
  • 更多特点由你来发现。


一、分页控件的属性:

---可显示设置属性
 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等)的存储过程分页:

分页存储过程SQL
 
-- =============================================
-- Foolin收集(来自网上,佚名)
-- Create date: 2010-09-22
-- Description:    存储过程分页,支持分页查询
-- 调用:(排序ASC不可少)
--       exec Wb_Page 'select * from [YouTable] ', 20, 0, 'CreateTime ASC,  Money DESC' 
-- =============================================
CREATE PROCEDURE [dbo].[SP_Page]
(
 @Sql nvarchar(1024),   --查询语句
 @Sort nvarchar(100) = '',    --排序字段
 @PageSize int = 20,    --分页大小
 @PageIndex int = 1,    --分页索引
 @TotalCount int = 0 output --总数    
)
AS

-- 值默认值
if (IsNUll(@PageSize,0)=0)
    Set @PageSize=20
if (IsNull(@PageIndex,0)=0)
    Set @PageIndex=1

set nocount on
/*声明查询字符串*/
declare @strSQL nvarchar(4000)

set @strSQL = ' select @TotalCount=count(*) from ('+@Sql+') as t ' 

/*取得查询结果总数*/
exec sp_executesql
@strSQL, 
N'@TotalCount int=0 OUTPUT', 
@TotalCount=@TotalCount OUTPUT 

declare @ItemCount int 
declare @_PageIndex int

set @_PageIndex = @PageIndex; --索引从1开始
--set @_PageIndex = @PageIndex + 1; --索引从0开始

/*确定搜索边界*/
set @ItemCount = @TotalCount - @PageSize * @_PageIndex

if(@ItemCount < 0) 
    set @ItemCount = @ItemCount + @PageSize 
else 
    set @ItemCount = @PageSize 

if(@ItemCount < 0) return 1 

if(@Sort != '')
begin
    /*声明排序变量*/
    declare @IndexSort1 nvarchar(50), @IndexSort2 nvarchar(50), @Sort1 nvarchar(50), @Sort2 nvarchar(50)
    
    SET @Sort1 = @Sort
    SET @Sort2 = Replace(Replace(Replace(@Sort, 'DESC', '@SORT'), 'ASC', 'DESC'), '@SORT', 'ASC')

    set @strSQL = 'SELECT * FROM 
    (SELECT TOP ' + STR(@ItemCount) + ' * FROM 
    (SELECT TOP ' + STR(@PageSize * @_PageIndex) + ' * FROM 
    ('+@Sql+') AS t0 
    ORDER BY '+@Sort1 +') AS t1 
    ORDER BY '+@Sort2 +') AS t2 
    ORDER BY ' +@Sort 
end
else
begin
    set @strSQL = 'SELECT * FROM 
    (SELECT TOP ' + STR(@ItemCount) + ' * FROM 
    (SELECT TOP ' + STR(@PageSize * @_PageIndex) + ' * FROM 
    ('+@Sql+') As t0) 
    aS t1) 
    AS t2'
end

exec sp_executesql 
@strSQL

 
 

后台aspx.cs页面绑定Repeater数据源、初始化控件:

 

Demo后台处理代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Data.SqlClient;

public partial class _Default : System.Web.UI.Page
{

    private string connectionString = "server=(local)\\SQL2005;database=LingPager;uid=sa;pwd=123456 ";   //数据库连接字符串

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            BindDataList();
        }
    }


    protected void BindDataList()
    {
        //string strSql = @"SELECT *, '--' AS Province FROM T_Area";    //普通SQL语句
        string strSql = @"
            SELECT A.AreaID, A.Area, A.AreaName, A.RegionNO, IsNull(B.AreaName,'--') AS Province
            FROM T_Area A
            LEFT JOIN T_Area B
            ON A.ParentID=B.AreaID
        ";  //多表查询SQL语句

        //排序字段,必须,注意ASC不可以省略
        string fieldOrder = "Province ASC";

        int records = 0;    //总记录数

        //绑定数据
        repList.DataSource = GetDataList(strSql, fieldOrder, Pager1.PageSize, Pager1.PageIndex, out records);   //读取数据源并绑定
        repList.DataBind();

        //设置页面(必须)
        Pager1.SetPage(records);    //初始化分页条


        /************ Pager属性设置(可选)  *********/
        //Pager1.ShowPageJump = true;
        Pager1.ShowPageGo = true;
        Pager1.ShowPageLan = 0; //导航条语言:0=默认,1=中文,2=英语
        //更多设置....
        /************ Pager 属性 *********/

    }


    /// <summary>
    /// 取数据接口
    /// </summary>
    /// <param name="strSql"></param>
    /// <param name="fieldOrder"></param>
    /// <param name="pageSize"></param>
    /// <param name="pageIndex"></param>
    /// <param name="records"></param>
    /// <returns></returns>
    public DataTable GetDataList(string strSql, string fieldOrder, int pageSize, int pageIndex, out int records)
    {
        DataTable dt = null;         //返回的数据集   
        records = 0;    //事先赋值

        using (SqlConnection sqlConn = new SqlConnection(connectionString))
        {
            //打开连接
            sqlConn.Open();

            //初始化参数
            

            SqlCommand sqlCmd = new SqlCommand();
            sqlCmd.Connection = sqlConn;
            sqlCmd.CommandText = "SP_Page";
            sqlCmd.CommandType = CommandType.StoredProcedure;

            #region  ___存储过程参数___
            SqlParameter recordsParam = new SqlParameter("@TotalCount", SqlDbType.Int, 32);
            recordsParam.Direction = ParameterDirection.Output;
            //创建
            sqlCmd.Parameters.Add(new SqlParameter("@Sql", SqlDbType.NVarChar, 1024));
            sqlCmd.Parameters.Add(new SqlParameter("@Sort", SqlDbType.NVarChar, 100));
            sqlCmd.Parameters.Add(new SqlParameter("@PageSize", SqlDbType.Int, 32));
            sqlCmd.Parameters.Add(new SqlParameter("@PageIndex", SqlDbType.Int, 32));
            sqlCmd.Parameters.Add(recordsParam);
            //赋值
            sqlCmd.Parameters[0].Value = strSql;
            sqlCmd.Parameters[1].Value = fieldOrder;
            sqlCmd.Parameters[2].Value = pageSize;
            sqlCmd.Parameters[3].Value = pageIndex;
            sqlCmd.Parameters[4].Direction = ParameterDirection.Output;
            #endregion ___存储过程参数___

            //取数据
            DataSet ds = new DataSet();
            SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
            sda.Fill(ds);
            if (ds != null && ds.Tables.Count > 0)
            {
                dt = ds.Tables[0];
            }

            records = (int)recordsParam.Value;  //返回记录数

            //释放资源
            if (sqlConn != null)
            {
                sqlConn.Close();
                sqlConn.Dispose();
            }

        }


        return dt;
    }

}

 

Repeater分页控件源码下载:点击这里下载  

 

 

分页效果大家可以看:http://www.kuaile.us/default.aspx?Paging1=2

 

注:转载请声明来自博客:http://blog.csdn.net/foolin/article/details/6864317,大家好,我是刘付灵(Foolin)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值