Asp.net自己动手写分页控件(完美包含数字分页)_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > Asp.net自己动手写分页控件(完美包含数字分页)

Asp.net自己动手写分页控件(完美包含数字分页)

 2010/12/9 9:13:41  agameplay  http://agameplay.javaeye.com  我要评论(0)
  • 摘要:昨天在Q-Q群(居然会屏蔽,呵呵,就只有打横线了)里探讨了一下关于Page类重写的实现,知道了Asp.net框架结构的一些底层,呵呵收益很大,因为一直以来都没有系统学习过Asp.net,写的程序都是自己苦苦自学来的,不容易啊。于是今天尽兴做完了一个分页控件(经常用到),网上找的很多分页控件都会在页面中产生乱码(ViweState),而我不太喜欢这个东东,减少或者没有乱码能提高网站在搜索引擎中的表现。扯远了这里现附上代码,说明都在注释中,需要补充说明的在最下面:1、打开VS(我使用的VS2008
  • 标签:.net ASP.NET net 完美 自己 控件

昨天在Q-Q群(居然会屏蔽,呵呵,就只有打横线了)里探讨了一下关于Page类重写的实现,知道了Asp.net框架结构的一些底层,呵呵收益很大,因为一直以来都没有系统学习过Asp.net,写的程序都是自己苦苦自学来的,不容易啊。


于是今天尽兴做完了一个分页控件(经常用到),网上找的很多分页控件都会在页面中产生乱码(ViweState),而我不太喜欢这个东东,减少或者没有乱码能提高网站在搜索引擎中的表现。


扯远了? 这里现附上代码,说明都在注释中,需要补充说明的在最下面:


1、打开VS(我使用的VS2008),新建一个项目(为了同步可以新建一个空的解决方案)命名为database的类库项目,在项目中添加一个UserPage.cs类,该类需要重写一个Render,用于将写入东西到控件中,当然,首先需要继承Control类。

  1. using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web.UI;
    namespace database
    {
        public class UserPage : Control
        {
            /// <summary>
            /// 设置每一个页面显示的条数
            /// </summary>
            public int EachPageItemCount=0;
            /// <summary>
            /// 设置当前页
            /// </summary>
            public int CurrentPage=0;
            /// <summary>
            /// 设置总条目数
            /// </summary>
            public int ItemCount = 0;
            /// <summary>
            /// 设置分页后的总页数
            /// </summary>
            private int AllPageCount { get; set; }
            /// <summary>
            /// 设置第一页
            /// </summary>
            private int FirstPage
            {
                get
                {
                    return 1;
                }
            }
            /// <summary>
            /// 设置最后页
            /// </summary>
            private int LastPage
            {
                get
                {
                    return AllPageCount;
                }
            }
            /// <summary>
            /// 设置上一页
            /// </summary>
            private int BackPage
            {
                get
                {
                    return CurrentPage < 2 ? 1 : (CurrentPage - 1);
                }
            }
            /// <summary>
            /// 设置下一页
            /// </summary>
            private int NextPage
            {
                get
                {
                    return CurrentPage == AllPageCount ? AllPageCount : CurrentPage + 1;
                }
            }
            private int _PageNumber;
            /// <summary>
            /// 设置每一页显示的数字个数  必须大于0且为偶数
            /// </summary>
            public int PageNumber
            {
                get
                {
                    if (_PageNumber < 2)
                    {
                        return 0;
                    }
                    else if (_PageNumber % 2 != 0)
                    {
                        return _PageNumber - 1;
                    }
                    else
                    {
                        return _PageNumber;
                    }
                }
                set
                {
                    _PageNumber = value;
                }
            }
            private bool _IndexAndLastState = true;
            /// <summary>
            /// 是否显示首尾页 默认显示
            /// </summary>
            public bool IndexAndLastState
            {
                get { return _IndexAndLastState; }
                set { _IndexAndLastState = value; }
            }
            private bool _NumberState = true;
            /// <summary>
            /// 是否显示数字分页 默认显示
            /// </summary>
            public bool NumberState
            {
                get { return _NumberState; }
                set { _NumberState = value; }
            }
            private bool _PageInfoState = true;
            /// <summary>
            /// 是否显示分页信息(如页数 条数)
            /// </summary>
            public bool PageInfoState
            {
                get { return _PageInfoState; }
                set { _PageInfoState = value; }
            }
            /// <summary>
            /// 设置当前页面的Url
            /// </summary>
            public string PageUrl = "";
    
            /// <summary>
            /// 重写Render方法  将需要信息写入html控件
            /// </summary>
            /// <param name="writer"></param>
            protected override void Render(HtmlTextWriter writer)
            {
                if (ItemCount > EachPageItemCount)
                {
                    AllPageCount = (ItemCount % EachPageItemCount) < 1 ? ItemCount / EachPageItemCount : (ItemCount / EachPageItemCount) + 1;//获取总页码数
                }
                else
                {
                    AllPageCount = 1;
                }
                int p = 0;/*页码(1 2 3 4 5.....)*/
                string strText = string.Empty;
                for (int i = 1; i < PageNumber; i++)
                {
                    if (CurrentPage <= (AllPageCount - PageNumber / 2))
                    {
                        if (CurrentPage >= PageNumber / 2)
                        {
                            p = (CurrentPage + i) - PageNumber / 2;
                        }
                        else/*定义当当前页小于每页页码个数/2时同样显示出定义的页码个数*/
                        {
                            int j = CurrentPage;
                            p = CurrentPage + i - j;
                            j++;
                        }
                    }
                    else
                    {
                        int j = -1;
                        p = AllPageCount - PageNumber + i - j;
                        j++;
                    }
                    if (p > 0 && p <= AllPageCount)
                    {
                        if (p == CurrentPage)
                        {
                            strText += "<strong>" + p + "</strong>";
                        }
                        else
                        {
                            strText += "<a href=\"" + PageUrl + p + "\">" + p + "</a>";
                        }
                    }
                }
                StringBuilder sb = new StringBuilder();
                if (IndexAndLastState)
                {
                    sb.Append("<a href=\"" + PageUrl + FirstPage + "\" class=\"songti\"><<首页</a>");
                }
                sb.Append("<a href=\"" + PageUrl + BackPage + "\" class=\"songti\"><上一页</a>");
                if (NumberState)
                {
                    sb.Append(strText);
                }
                sb.Append("<a href=\"" + PageUrl + NextPage + "\" class=\"songti\">下一页></a>");
                if (IndexAndLastState)
                {
                    sb.Append("<a href=\"" + PageUrl + LastPage + "\" class=\"songti\">尾页>></a>");
                }
                if (PageInfoState)
                {
                    sb.Append("<span>共" + AllPageCount + "页 " + ItemCount + "条信息</span>");
                }
                writer.Write(sb);
                base.Render(writer);
            }
        }
    }
    
    ?

?



2、在新建一个WEB项目,为了方便同步可以先添加对database的引用,也可以写完后直接在VS左侧中工具选项中添加Dll,在WEB项目中默认建立一个Default.aspx,里面放入Repeater控件用于数据的绑定,然后需要分页控件,在aspx页面的顶部加入

<%@ Register assembly="database" namespace="database" tagprefix="cc1" %>

具体的参数到网上找找说明,这里不概述,然后就是引用控件
<cc1:UserPage ID="MyPage" runat="server" PageNumber="8"></cc1:UserPage>

具体的呈现样式有三个状态可选(显示收尾、显示数字分页、显示页码信息),同时如果设置了显示数字分页则还需要设置分页的个数,这里必须是偶数,具体的逻辑请到用户控件代码中看。

然后就是对数据控件后台参数的设置,有4个参数,具体说明请看用户控件。

MyPage.ItemCount = strCount;
            MyPage.CurrentPage = int.Parse(Request["page"].ToString());
            MyPage.EachPageItemCount = pageSize;
            MyPage.PageUrl = "Default.aspx?page=";



这个就是完整的分页了,当然,分页采用的是存储过程,基本思路是在存储过程中将当前页参数与每页显示的条数穿进去,采用TOP找到上一页下一页,这个脱离本篇的范畴了,可以到网上找存储过程分页,以后有空也单独特出来吧。

基本的思路是这样的,生成的代码全纯净,无任何乱码(当然,首先要将aspx页面中的form的ruanat="server"去掉),由于涉及到对表的操作,就不贴附件代码了,需要动手的地方还是多动手吧,呵呵

---agameplay
发表评论
用户名: 匿名