现在的位置: 首页 > 综合 > 正文

小巧精致的ASP.Net分页控件

2018年01月23日 ⁄ 综合 ⁄ 共 7508字 ⁄ 字号 评论关闭

效果演示如下:
效果演示

具体的控件代码如下,在你的VS.Net里新建一个用户控件,然后把下面的代码拷贝进去就可以用了,最下面是使用示例:

using System;

using System.Data;

using System.Configuration;

using System.Collections;

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.Text;

using System.Text.RegularExpressions;



namespace MyTest 

{

    public partial class PageShow : System.Web.UI.UserControl

    {

        #region 私有成员

        /// <summary>

        /// 当前页的页码的背景色

        /// </summary>

        private string _color = "#a8ceff";



        /// <summary>

        /// 总记录数

        /// </summary>

        private int _recTotal = 0;



        /// <summary>

        /// 每页显示的记录数, 默认为10

        /// </summary>

        private int _pageSize = 10;



        /// <summary>

        /// 当前页的页码左右要显示的页码的个数, 默认7个

        /// </summary>

        private int _pageShowNum = 7;

        #endregion



        #region 公共属性

        /// <summary>

        /// 设置或读取总记录数,不能小于0

        /// </summary>

        public int RecTotal

        {

            get { return _recTotal; }

            set

            {

                if (value > 0) 

                    _recTotal = value;

            }

        }



        /// <summary>

        /// 设置或读取每页显示的记录数,不能小于0

        /// </summary>

        public int PageSize

        {

            get { return _pageSize; }

            set

            {

                if (value > 0) 

                    _pageSize = value;

            }

        }



        /// <summary>

        /// 读取总页数

        /// </summary>

        public int PageTotal

        {

            get {

                int total = (int)Math.Ceiling((double)_recTotal / _pageSize);

                return total;

                //return PageTotal; 

            }

        }



        /// <summary>

        /// 读取当前要显示第几页,注:页码传递方式是Request.QueryString["page"]

        /// </summary>

        public int PageIndex

        {

            get

            {

                int pageIndex = 1;



                string tmp = Request.QueryString["page"];

                if (tmp != null && tmp != string.Empty)

                {

                    if (tmp == "end")

                        pageIndex = PageTotal;

                    else

                    {

                        try

                        {

                            pageIndex = int.Parse(tmp);

                            if (pageIndex > PageTotal)

                                pageIndex = PageTotal;

                            else if (pageIndex < 1)

                                pageIndex = 1;

                        }

                        catch (Exception)

                        {

                            pageIndex = 1;

                        }

                    }

                }

                return pageIndex;

            }

        }



        /// <summary>

        /// 设置或读取当前页的页码的背景色,默认为#a8ceff

        /// </summary>

        public string Color

        {

            get { return _color; }

            set { _color = value; }

        }



        /// <summary>

        /// 当前页的页码左右要显示的页码的个数,默认7个

        /// </summary>

        public int PageShowNum

        {

            get { return _pageShowNum; }

            set { _pageShowNum = value; }

        }

        #endregion



        /// <summary>

        /// 重写Render事件,发送生成的分页Url

        /// </summary>

        /// <param name="writer"></param>

        protected override void Render(HtmlTextWriter writer)

        {

            if (PageTotal <= 1)

            {//少于1页时,不显示

                return;

            }



            StringBuilder writeStr = new StringBuilder();



            #region 控件使用的CSS代码

            writeStr.Append(@"

<style type='text/css'>.page_total {background-color: #F5FBFF; border: 1px solid #86B9D6; border-right: 0px solid #86B9D6; font-weight: bold; }

.page_pages {background-color: #F5FBFF; border: 1px solid #86B9D6; margin-right:1px; vertical-align: middle; font-weight: bold; }

.page_num {background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; vertical-align: middle; }

a:hover.page_num  {background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }

.page_curpage { margin-right:1px; border: 1px solid #DEDEB8; vertical-align: middle; background-color: #FFFF80; color: #92A05A; font-weight: bold; }

.page_bar { margin: 1px 0px; clear: both; }

.page_bar a { float: left; padding: 1px 4px; font-size: 12px; text-decoration: none; }

.page_redirect { background-color: #FFFFFF; border: 1px solid #DEDEB8; margin-right:1px; font-size: 12px !important; font-size: 13px; }

a:hover.page_redirect { background-color: #F5FBFF; border: 1px solid #86B9D6; text-decoration: none; }

</style>");

            #endregion



            writeStr.Append("<table cellspacing='0' cellpadding='0' align='left' style='clear: both;'>");

            writeStr.Append("<tr><td valign='bottom'>");

            writeStr.Append("<div class='page_bar'>");



            writeStr.Append("<a class='page_total' title='记录总数'> " + _recTotal.ToString() + " </a>");

            writeStr.Append("<a class='page_pages' title='当前页/总页数'> " + PageIndex + "/" + PageTotal + " </a>");



            string url = GetUrl().ToLower();//取得当前页面的完整URL

            string tmp;



            //没有page时,加一个page, 方便后面替换

            if (url.IndexOf("page=") < 0)

            {

                url = url + ((url.IndexOf("?") < 0) ? "?" : "&") + "page=1";

            }



            //设定正则表达式,用于替换url中的page=字符串

            Regex my = new Regex(@"(page=[0-9]*(end)*)", RegexOptions.IgnoreCase);



            #region 如果当前是指定显示个数的页码之后的页时,加上到第一页和上一页的链接(此时页面不会显示页码1)

            if (PageIndex > _pageShowNum + 1)

            {

                //第一页

                tmp = my.Replace(url, "page=1");

                writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='第一页'>|<</a>");

                //上一页

                tmp = my.Replace(url, "page=" + (PageIndex - 1).ToString());

                writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='上一页'><</a>");

            }

            #endregion



            //总共显示( _pageShowNum * 2 + 1 )页的链接,从当前页往前_pageShowNum页,往前不足_pageShowNum页时,后面的页数增加.

            int countPage = 0;//用于统计是否超过( _pageShowNum * 2 + 1 )页

            int loopStart;



            //当总页数大于( _pageShowNum * 2 + 1 ),且当前页为最后_pageShowNum页时,保持页面页码数不少于( _pageShowNum * 2 + 1 )

            if (PageTotal - PageIndex >= _pageShowNum)

            {

                // 总页数 减 当前页码 大于等于左边要显示的个数时,循环 从当前页码 大于等于左边要显示的个数 开始

                loopStart = PageIndex - _pageShowNum;

            }

            else

            {

                loopStart = PageTotal - _pageShowNum * 2;// PageIndex - _pageShowNum - (_pageShowNum - PageTotal + PageIndex) ==> PageTotal - _pageShowNum * 2

            }



            for (int loop = loopStart; loop <= PageTotal; loop++)

            {

                if (loop < 1)

                    continue;

                else

                    countPage++;



                #region 已经显示了( _pageShowNum * 2 + 1 )页 并且 当前页数小于等于总页数时,加上到最末页和上一页的链接并退出循环(不会显示最后1页的页码时)

                if (countPage > (_pageShowNum * 2 + 1) && loop <= PageTotal)

                {

                    //下一页

                    tmp = my.Replace(url, "page=" + (PageIndex + 1).ToString());

                    writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='下一页'>></a>");

                    //最终页

                    tmp = my.Replace(url, "page=" + PageTotal.ToString());// my.Replace(url, "page=end");

                    writeStr.Append("<a class='page_redirect' href='" + tmp + "' title='最末页'>>|</a>");

                    break;

                }

                #endregion



                #region 添加当前循环页的链接

                if (loop == PageIndex)

                {//当前页

                    writeStr.Append("<a class='page_curpage' style='background-color:" + _color + "'>" + 

                        loop.ToString() + "</a>");// style='width:" + (loop > 99 ? (width + 5).ToString() : width.ToString()) + "px;'

                }

                else

                {

                    //计算下一页的链接

                    tmp = my.Replace(url, "page=" + loop.ToString());

                    writeStr.Append("<a class='page_num' href='" + tmp + "' title='第" + 

                        loop.ToString() + "页''>" + loop.ToString() + "</a>");

                }

                #endregion

            }

            writeStr.Append("</div></td></tr></table>");



            writer.Write(writeStr.ToString());

        }



        /// <summary>

        /// 获取当前页面的完整URL地址信息

        /// </summary>

        /// <returns></returns>

        public string GetUrl()

        {

            string url;



            url = System.Web.HttpContext.Current.Request.ServerVariables["SERVER_NAME"];



            if (System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"] != "80")

                url += ":" + System.Web.HttpContext.Current.Request.ServerVariables["SERVER_PORT"];

            //strTemp = strTemp & CheckStr(Request.ServerVariables("URL")) 



            url += System.Web.HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"];

            if (!(System.Web.HttpContext.Current.Request.QueryString == null || System.Web.HttpContext.Current.Request.QueryString.ToString() == ""))

            {

                url += "?" + System.Web.HttpContext.Current.Request.QueryString.ToString();

            }

            string https = System.Web.HttpContext.Current.Request.ServerVariables["HTTPS"];

            if (https == null || https == string.Empty || https == "off")

            {

                url = "http://" + url;

            }

            else

            {

                url = "https://" + url;

            }

            return url;

        }

    }

}
用法示例(假设用户控件名为:PageShow.ascx),把下面的代码拷贝到一个aspx文件中,即可运行:
<%@ Page Language="C#" %>

<%@ Register Src="PageShow.ascx" TagName="PageShow" TagPrefix="uc1" %>



<!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>无标题页</title>

    <script type="text/C#" runat="server">

        void Page_Load(object sender, EventArgs e)

        {

            // 创建一个DataTable,用作数据源,你应该是去数据库取数据了

            System.Data.DataTable dt = new System.Data.DataTable();

            dt.Columns.Add("a1");

            for (int loop = 1; loop <= 1000; loop++)

            {

                System.Data.DataRow dr = dt.NewRow();

                dt.Rows.Add(dr);

                dr["a1"] = "aaa" + loop.ToString();

            }



            PageShow1.RecTotal = dt.Rows.Count; // 必需设定,否则不会显示, 设定记录总数

            PageShow1.Color = "red";            // 可以不设, 设置当前页码的背景色,默认为#a8ceff

            PageShow1.PageShowNum = 3;          // 可以不设, 设置当前页的页码左右要显示的页码的个数,默认7个

            PageShow1.PageSize = 6;             // 可以不设, 设置每页显示的记录数,默认10条

            

            // 开始分页,绑定到页面上的Repeater

            System.Web.UI.WebControls.PagedDataSource pgd = new PagedDataSource();

            pgd.DataSource = dt.DefaultView;

            pgd.CurrentPageIndex = PageShow1.PageIndex - 1; // 设置PagedDataSource当前显示第几页,注意减1

            pgd.PageSize = PageShow1.PageSize;              // 设置PagedDataSource每页显示的记录数,默认10条

            pgd.AllowPaging = true;



            Repeater1.DataSource = pgd;

            Repeater1.DataBind();

        }

    </script>

</head>

<body>

    <form id="form1" runat="server">

    <div>

        <uc1:PageShow ID="PageShow1" runat="server" />

        <br />

        <asp:Repeater ID="Repeater1" runat="server">

            <ItemTemplate>

                <br />

                <%# DataBinder.Eval(Container.DataItem, "a1")%>

            </ItemTemplate>

        </asp:Repeater>

        <br />

    </div>

    </form>

</body>

</html>

抱歉!评论已关闭.