asp.net 自定义分页控件_[Asp.Net教程]                                           					
页面中数据的分页功能常常是令程序员比较头疼的一件事情,并非是技术原因,而是分页的繁琐(包括:风格统一、参数的维护……)。ASP.NET控件中的GridView和DataGrid等都直接支持分页,但这两中控件所擅长的是处理表格数据,而我们往往需要的显示风格要比表格丰富的多;以我往常经验,我比较喜欢Repeater,可一随心所欲的驾驭它来完成任何复杂的显示,但可惜的是它没有提供自动的分页功能。
我们何不把这分页功能给封装起来呢?
让我们来分析一下分页的封装到底要实现那些功能: 
数据显示控件不应该关心“页”的问题,因为它的功能是显示数据,你只需要把它要显示的数据给它就行了; 
你必须承认分页的独立性,它与任何显示控件物理上是隔离的,所以我们在设计该控件时不应该考虑任何数据显示控件; 
分页控件需要维护一个“当前页”、“页大小”的上下文; 
要确定分页控件的数据无关性(这里的“数据”指的是在数据显示控件中显示的数据),数据显示控件的数据源应该由系统的“业务层”提供,而业务层的数据提供服务所查询的具体数据有分页控件的“当前页”、“页大小”确定(如:GetData(int pageIndex,int pageSize);); 
分页控件必须能够维护当前页面的参数; 
分页控件能够维护统一的风格(由用户指定显示样式,否则就显示默认样式)。
根据以上的分析,我们就可以来设计“分页控件”(SimplePaper)了,看看咱们的实现代码吧:
首先实现的是SimplePaper维护的数据及属性,每个属性的描述这里就不再详述了
  1    private string _class;
  2    private int _pageSize = 10;
  3    private int _numberCount = 10;
  4    private int _virtualCount = 0;
  5
  6    private string _prevText = "上一页";
  7    private string _nextText = "下一页";
  8    private string _firstText = "第一页";
  9    private string _lastText = "最末页";
 10
 11    /**//// 
 12    /// 获取或设置控件关联的样式类
 13    /// 
 14    [Category("Behavior")]
 15    [Description("Css的样式类名称")]
 16    public string Class {
 17      get {
 18        return _class;
 19      }
 20      set {
 21        _class = value;
 22      }
 23    }
 24
 25    /**//// 
 26    /// 获取或设置“上一页”在分页导航条中显示的文本,默认值“上一页”
 27    /// 
 28    [Category("Behavior")]
 29    [Description("上一页文本")]
 30    public string PrevText {
 31      get {
 32        return _prevText;
 33      }
 34      set {
 35        _prevText = value;
 36      }
 37    }
 38
 39    /**//// 
 40    /// 获取或设置“下一页”在分页导航条中显示的文本,默认值“下一页”
 41    /// 
 42    [Category("Behavior")]
 43    [Description("下一页文本")]
 44    public string NextText {
 45      get {
 46        return _nextText;
 47      }
 48      set {
 49        _nextText = value;
 50      }
 51    }
 52
 53    /**//// 
 54    /// 获取或设置“第一页”在分页导航条中显示的文本,默认值“第一页”
 55    /// 
 56    [Category("Behavior")]
 57    [Description("第一页文本")]
 58    public string FirstText {
 59      get {
 60        return _firstText;
 61      }
 62      set {
 63        _firstText = value;
 64      }
 65    }
 66
 67    /**//// 
 68    /// 获取或设置“最末页”在分页导航条中显示的文本,默认值“最末页”
 69    /// 
 70    [Category("Behavior")]
 71    [Description("最末页文本")]
 72    public string LastText {
 73      get {
 74        return _lastText;
 75      }
 76      set {
 77        _lastText = value;
 78      }
 79    }
 80    
 81    /**//// 
 82    /// 获取或设置分页的大小,默认值10
 83    /// 
 84    [Category("Behavior")]
 85    [Description("页大小")]
 86    public int PageSize {
 87      get {
 88        return _pageSize;
 89      }
 90      set {
 91        _pageSize = value;
 92      }
 93    }
 94
 95    /**//// 
 96    /// 获取或设置分页导航条中显示的页码数量,默认10
 97    /// 
 98    [Category("Behavior")]
 99    [Description("分页中要显示的页码数量")]
100    public int NumberCount {
101      get {
102        return _numberCount;
103      }
104      set {
105        _numberCount = value;
106      }
107    }
108
109    /**//// 
110    /// 获取或设置查询得到的总记录数
111    /// 
112    [Browsable(false)]
113    public int VirtualCount {
114      get {
115        return _virtualCount;
116      }
117      set {
118        _virtualCount = value;
119      }
120    }
121
122    /**//// 
123    /// 获取总页数
124    /// 
125    [Browsable(false)]
126    public int PageCount {
127      get {
128        if (Context == null)
129          return 10;
130
131        int count = (VirtualCount - 1) / PageSize + 1;
132        if (count <= 0)
133          count = 1;
134
135        return count;
136      }
137    }
138
139    /**//// 
140    /// 获取当前页码
141    /// 
142    [Browsable(false)]
143    public int CurrentPage {
144      get {
145        if (Context == null)
146          return 1;
147
148        string tempPage = Page.Request.QueryString[KEY_PAGE];
149        int _currPage = 1;
150        if (!Int32.TryParse(tempPage, out _currPage)) {
151          _currPage = 1;
152        }
153        return _currPage;
154      }
155    }我们要维护当前页面的参数,这要费一点功夫了
 1    private static string KEY_PAGE = "page";
 2    private static readonly Regex RX = new Regex(@"&page=\d+", RegexOptions.Compiled);
 3    
 4    private string GetQueryFormat() {
 5      // Prepare the query string
 6      string query = "";
 7      if (Context != null) {
 8        query = Page.Request.Url.Query.Replace('?', '&');
 9      }
10
11      query = RX.Replace(query, String.Empty, -1);
12      query = "[{1}] ";
13
14      return query;
15    }分页控件无非是在页面提供一个页码序列、上一页、下一页等超链接,我们只要让控件照样输出(Render)就可以了
    protected override void Render(HtmlTextWriter writer) {
      string query = GetQueryFormat();
      // Prepare the necessary number
      int page = CurrentPage;
      int count = PageCount;
      int nums = NumberCount-1;
      int center = nums / 2;
      int beginIndex = 1;
      // Calculate the first page number in the pagger bar
      if (count > nums && page > center) {
        beginIndex = page - center;
        if ((count - beginIndex) <= nums)
          beginIndex = count - nums;
      }
      // Calculate the last page number in the pagger bar
      int endIndex = beginIndex + nums;
      if (endIndex > count)
        endIndex = count;
      // Render the pagger bar
      
      writer.AddAttribute(HtmlTextWriterAttribute.Id, ClientID);
      if (!String.IsNullOrEmpty(_class)) {
        writer.AddAttribute(HtmlTextWriterAttribute.Class, _class);
      } else {
        writer.AddStyleAttribute(HtmlTextWriterStyle.PaddingLeft, "18px");
        writer.AddStyleAttribute(HtmlTextWriterStyle.FontSize, "14px");
        writer.AddStyleAttribute("word-spacing", "4px");
      }
      writer.RenderBeginTag(HtmlTextWriterTag.Div);
      writer.Write(String.Format(query, 1, FirstText));
      writer.Write(String.Format(query, page>1?(page-1):1, PrevText));
      for (int i = beginIndex; i <= endIndex; i++) {
        if (page == i) {
          writer.Write(i);
          writer.Write(" ");
        } else {
          writer.Write(String.Format(query, i, i));
        }
      }
      writer.Write(String.Format(query, page < count ? (page + 1) : page, NextText));
      writer.Write(String.Format(query, count, LastText));
      writer.Write(String.Format(" {0} / {1}", page, count));
      writer.RenderEndTag();
    }
好了,到现在,我们大功告成,整理起来试一下吧,很爽!!!点下载开始下载!
来源:http://www.cnblogs.com/netEagle