ASP.NET分页组件学与用——教学篇
 
       没有人会怀疑分页组件在WEB应用程序中的作用。数据库中的记录数成千上万甚至过亿,如果一股脑儿显示在一页显然毫不现实,这样的程序员也太小儿科了。所以,最好的办法就是分页显示,每页只显示数据库中的一部分记录,可以翻页,也可以输入一个页码翻到指定的页面,这种方式也是当前比较常见的用法。
 
       本文的不同之处在于,我把分页的功能封装在组件中,一方面体现了面向对象的特点,另一方面也方便发布、共享和使用。事先声明,本文不再讲述组件创建的详细过程,如果有疑点请参考本BLOG其他相关文章(ASP.net组件设计浅论,ASP.NET组件编程step by step)。
 
       首先来看看该组件的外观:
 
 
       该组件最后运行显示在客户端其实是一个表格,表格被分成三段,第一段是与页和记录相关的信息;第二段是页导航,该导航显示一组带超链接的数字,通过点击数字可以转移到对应的页;第三段有两个HTML控件,用户可以输入数字转移到指定的页。从图中也可以看出,该组件的功能非常简单明了。
 
       首先我们来关注第一部分。这一部分信息包括:当前页,总页数,每页显示的记录条数和总的记录条数。这些信息从组件外部传进来,所以我们定义对应的属性:
              private int _count;//每页显示的记录条数
        private int _currentPage;//当前页
        private int _allCount;//所有记录条数
        private int _showPages;//显示数字个数
我在注释_showPages这个属性的时候有点晦涩,所以需要简单的讲一下:该属性用来定义数字导航栏显示的数字个数,在上面的图中,定义显示10个数字,即从201——210,当然,根据需要,我们可以定义任意多个数字。
 
[DefaultValue(10),Category("Customer")]
        public int Count
        {
            set
            {
                if(value <= 0)
                    _count = 1;
                else
                    _count = value;
            }
            get
            {
                return _count;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int CurrentPage
        {
            set
            {
                if(value < 0)
                    _currentPage = 1;
                else
                    _currentPage = value;
            }
            get
            {
                return _currentPage;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int AllCount
        {
            get
            {
                return _allCount;
            }
            set
            {
                if(_allCount < 0)
                    throw new Exception("记录总条数不能为负数");
                else
                    _allCount = value;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int Pages//总页数
        {
            get
            {
                if(this._allCount % this._count > 0)
                    return ((int)this._allCount / this._count) + 1;
                else
                    return ((int)this._allCount / this._count);
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int ShowPages
        {
            set
            {
                if(value > 0)
                    _showPages = value;
                else
                    _showPages = 9;
            }
            get
            {
                return _showPages;
            }
    }
 
在定义的属性中,有一个叫Pages的属性,该属性不需要从外面传值,而过计算出来的。他的值等于总记录条数除以每页显示的记录条数(具体请见代码)。
 
现在我们要把这些值显示出来,用下面的代码显示:
//分页条分三部分,leftInfo是最左