Asp.net 利用Repeater和ObjectDataSource 实现自定义分页控件

原创 2007年09月27日 22:46:00

在Asp.net 应用开发中,Repeater 控件因其样式展现的灵活性而备受推崇.然而由于其没有分页功能,使得在实际运用中有所不便.

通过在网上四处搜罗一些相关的分页控件来看,SqlPager功能强大,可是感觉太烦.直到看到了.http://www.cnblogs.com/jecray/archive/2007/08/21/863395.aspx这篇文章,才觉得符合我所想要的.可惜的是,

不知道是不是jecray老兄太忙还是没有仔细测试过,和ObjectDataSource控件给合使用时,有一个小小的BUG.因此,我把它做了点小小的改动.同时为了方便其它的兄弟,就把它发出来做个纪念.在此,向jecray老兄致敬.

如果有空的话,再把它改成可以排序了.

下面是源码:

using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Xml.Linq;
using System.Web.UI.Design;
using System.ComponentModel;
using System.Reflection;
namespace DhzControl
{


    [DefaultProperty("Text")]
    [ToolboxData("<{0}:StudyezRepeater runat=server></{0}:StudyezRepeater >")]
    public class StudyezRepeater : Repeater, INamingContainer
    {
       
      
        //页码变量
        private int recordCount;
        private int pageIndex;
        private int pageSize = 5;
        private string urlPara = "pageID";
        [Bindable(true), DefaultValue(10)]
        public int PageSize
        {
            get { return pageSize; }
            set { pageSize = value; }
        }
        [Browsable(false)]
        public int PageIndex
        {
            get { return pageIndex; }
            set { pageIndex = value; }
        }
        [Browsable(false)]
        public int RecordCount
        {
            get { return recordCount; }
            set { recordCount = value; }
        }
        [Browsable(false)]
        public int PageCount
        {
            get
            {
                if (RecordCount % PageSize == 0)
                {
                    return RecordCount / PageSize;
                }
                else
                {
                    return RecordCount / PageSize + 1;
                }
            }
        }
        //页面地址 构造url用
        [Browsable(false)]
        public string RawURL
        {
            get { return Page.Request.Path; }
        }
        //传递页码参数的名称
        [Bindable(true), DefaultValue(typeof(String), "pageID")]
        public string URLPara
        {
            get { return urlPara; }
            set { urlPara = value; }
        }
        protected override void CreateChildControls()
        {
            //初始化 导航按钮

            int.TryParse(HttpContext.Current.Request.QueryString[URLPara], out pageIndex);
            if (PageIndex != 0)
                PageIndex--;
            this.SelectArguments.StartRowIndex = PageIndex * PageSize;
            this.SelectArguments.MaximumRows = PageSize;
            ObjectDataSource obj = (ObjectDataSource)this.Page.FindControl(this.DataSourceID);
            obj.Selecting += new ObjectDataSourceSelectingEventHandler(ObjectDataSource_Selecting);
            base.CreateChildControls();
        }

        protected virtual  void ObjectDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
        {
            //此处可以采用缓存来管理,可以重写
            
            ObjectDataSource obj = (ObjectDataSource)this.Page.FindControl(this.DataSourceID);
            string countMethodName = obj.SelectCountMethod;
            Type type = System.Web.Compilation.BuildManager.GetType(obj.TypeName, false, true);
            MethodInfo methodInfo = type.GetMethod(countMethodName);
            object[] parameters = null;
            if (e.InputParameters != null && e.InputParameters.Count > 0)
            {
                int lc = e.InputParameters.Count;
                parameters =new  object[lc];
                for (int i = 0; i < lc; i++)
                {
                    parameters[i] = e.InputParameters[i];
                }
            }
            if (methodInfo.IsStatic)
            {

          
                int.TryParse(methodInfo.Invoke(null, parameters).ToString (), out recordCount);
           //     RecordCount = recordCount;
            }
            else
            {
                object instance = Activator.CreateInstance(type);
                int.TryParse(methodInfo.Invoke(instance, parameters).ToString(), out recordCount);
           //     RecordCount = recordCount;
            }
        }

        protected override void Render(HtmlTextWriter writer)
        {
          

            SetPagerStatus();
           
            //输出repeater
            base.Render(writer);
            //输出分页信息
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            CreateNavBar(writer);
            writer.RenderEndTag();
         
        }

        protected virtual void CreateNavBar(HtmlTextWriter wirter)
        {

//根据自已的要求可以重写.
            for (int i = 1; i < PageCount; i++)
            {
                wirter.Write(string.Format("<a href='{0}?{1}={2}'>{2}</a>&nbsp;", RawURL, URLPara, i));
            }
            wirter.Write(string.Format("<a href='{0}?{1}={2}'>{2}</a>", RawURL, URLPara, PageCount));
        }

        //设置分页状态
        public void SetPagerStatus()
        {
            //如果没记录则不显示
            if (PageCount == 0)
            {
                this.Visible = false;
                return;
            }
        }
    }

}

----------------------------------End-----------------

DataSrc.cs 文件

 

[Serializable]
public class Person
{
 public Person()
 {
  //
  // TODO: Add constructor logic here
  //
 }
    public Person(int age, string name)
    {
        _name = name;
        _age = age;
    }
    private string _name;
    private int _age;
    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
}
[DataObject(true)]
public class ObjDataSrc
{

/*Count方法和Persons方法也可以全部改成静态的以提升效率

*/
    public ObjDataSrc()
    {
    }
    public int Count(int age)
    {
        return 43;
    }
    [DataObjectMethod(DataObjectMethodType.Select )]
    public Person[] Persons(int startRecord, int maxRecord, int age, string strOrder)
    {
        Person[] p = new Person[maxRecord];
        for (int i = 1; i <= maxRecord; i++)
        {
            p[i - 1] = new Person(age, string.Format("{0}Name", startRecord + i - 1));
        }
        return p;
    }
}

---------------------------------------END-------------------------

test.aspx 页面

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register TagPrefix="my" Namespace="DhzControl" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <my:StudyezRepeater ID="cx" runat="server" DataSourceID="src" PageSize="10">
    <HeaderTemplate><table id="cv" style="background-color:Red ; width:400px; border-collapse:collapse ; border-width:thick"></HeaderTemplate>
    <ItemTemplate>
      <tr><td><%#  Eval("Name") %> </td> <td><%# Eval("Age") %></td></tr>
    </ItemTemplate>
    <FooterTemplate></table></FooterTemplate>
    </my:StudyezRepeater >
    <asp:ObjectDataSource ID="src" runat="server"  TypeName="ObjDataSrc" EnablePaging="true"
      SelectCountMethod="Count" SelectMethod="Persons"   SortParameterName="strOrder"
      StartRowIndexParameterName="startRecord" MaximumRowsParameterName="maxRecord">
      <SelectParameters>
       <asp:Parameter Type="int32" Name="age" DefaultValue="10" Direction="Input"  />
      </SelectParameters>
      </asp:ObjectDataSource>
     
    </div>
    </form>
</body>
</html>
----------------------------------现在,这个控件已经应用到自己的网站上www.studyez.com上面了.应用的时候都是重写了CreateNavBar------------------------

.NET实现Repeater控件+AspNetPager控件分页

.NET实现Repeater控件+AspNetPager控件分页 SqlConnection (.NET C#) 连接及分页  .net的访问数据机制决定了访问大量数据时会致使客户端机器消耗大...
  • kingmax54212008
  • kingmax54212008
  • 2013年03月07日 23:25
  • 3115

ObjectDataSource 数据源分页机制(转)

简而言之:比起没有分页多了四样东西: 1.一个允许分页熟悉 2.一个获取数据源count绑定函数 34.select函数多了两个参数(一个是开始index,一个是最大index) 示例: 一...
  • lonely_wm
  • lonely_wm
  • 2014年11月26日 23:42
  • 637

ASP.NET技巧:repeater实现多列显示

 一、下面的代码实现,每行显示三列前台代码:后台代码:protected int i=1;   private void Page_Load(object sender, System.EventAr...
  • mydriverc
  • mydriverc
  • 2007年06月08日 17:05
  • 1092

asp.net web页面自定义分页控件

这几天学习了一下自定义分页控件,现将实现方法记录下来,亲测可以实现:1.首先创建一个.ascx文件,命名为TurnPage,然后在里面写控件前台展示的界面:2.然后在TurnPage.ascx.cs里...
  • SunMoonJP
  • SunMoonJP
  • 2017年01月19日 09:33
  • 537

绑定数据 Repeater 与ObjectDataSource的用法

《》 首先添加一个WebForm页面。命名为DataList。在页面拖入一个Repeater 控件,和一个ObjectDataSource控件 点击“源” 看以看到源中的代码是这样的: ...
  • Fanbin168
  • Fanbin168
  • 2015年09月20日 00:56
  • 1486

asp.net中ObjectDataSource的参数值和GridView联合使用

在使用的时候,无论什么 时候调用ObjectDataSource的Seelect方法,它都会首先触发它的Selecting事件 ,然后才调用ObjectDataSource的隐含对象的方法,完成后则激...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2012年09月02日 16:05
  • 1694

学习总结:关于ASP.NET 中的 ObjectDataSource

1.    主要功能.Represents a business object that provides data to data-bound controls in multi-tier Web ...
  • hjon
  • hjon
  • 2009年03月07日 22:08
  • 702

ASP.NET - 对 ObjectDataSource 控件使用参数

 ObjectDataSource 控件基于 SelectMethod、InsertMethod、UpdateMethod 或 DeleteMethod 属性中所标识的方法名称以及组成业务对象方法签名...
  • dodream
  • dodream
  • 2009年11月27日 12:25
  • 3065

【ASP.NET】利用Repeater完成对SQL Server数据库的增删改查

在ASP.NET对于SQL Server数据库的增删改查自然是便利的,ASP.NET提供了大量封装好的数据库表格,例如GridView什么的,但这些组件只能通过VS自带的属性进行样式的修改,远不如类似...
  • yongh701
  • yongh701
  • 2016年01月11日 20:45
  • 3129

Repeater控件实现数据绑定,并实现分页效果

前台显示代码 姓名
  • ysj1163620987
  • ysj1163620987
  • 2012年08月30日 08:58
  • 2615
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Asp.net 利用Repeater和ObjectDataSource 实现自定义分页控件
举报原因:
原因补充:

(最多只允许输入30个字)