MyPager分页服务器控件

本文介绍了一个名为MyPager的自定义分页服务器控件,该控件专用于ASP.NET Web应用程序。MyPager提供了设置每页显示记录数、打印模式、数字按钮数量等功能,并且在页面回发时能正确维护状态。通过重写AddAttributesToRender、OnLoad和Render等方法,MyPager实现了分页逻辑,包括前后页链接、当前页数和总页数的显示。此外,控件还提供了PageChanged事件,方便开发者在用户切换页面时进行相应的操作。
摘要由CSDN通过智能技术生成

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;

namespace MyQuery.MyControl
{
    /// <summary>
    /// MyPager分页服务器控件
    /// </summary>
    [DefaultProperty("PageSize"),
    ParseChildren(false),
    PersistChildren(false),
    Description("专用于ASP.Net Web应用程序的分页控件"),
    Designer(typeof(MyPagerDesigner)),
    ToolboxData("<{0}:MyPager runat=server></{0}:MyPager>")]
    public class MyPager : Panel, INamingContainer, IPostBackEventHandler
    {
        #region 属性

        /// <summary>
        /// 获取或设置在控件的页导航元素中同时显示的数值按钮的数目。
        /// </summary>
        [Browsable(true),
        Description("要显示的页索引数值按钮的数目(0为无数字按钮及打印按钮)"),
        Category("导航按钮"),
        DefaultValue(10)]
        public int NumericButtonCount
        {
            get
            {
                object obj = ViewState["NumericButtonCount"];
                return (obj == null) ? 10 : (int)obj;
            }
            set
            {
                if (value != 10)
                    ViewState["NumericButtonCount"] = value;
            }
        }
        /// <summary>
        /// 获取或设置一个值,该值指示 MyPager 服务器控件是否向发出请求的客户端保持自己的视图状态,该属性经重写后不允许设为false。
        /// </summary>
        [Browsable(true),
        Description("显示打印按钮"),
        Category("导航按钮"),
        DefaultValue(false)]
        public bool EnablePrint
        {
            get
            {
                object obj = ViewState["EnablePrint"];
                return (obj == null) ? false : (bool)obj;
            }
            set
            {
                ViewState["EnablePrint"] = value;
            }
        }
        /// <summary>
        /// 获取或设置每页显示的项数。
        /// </summary>
        [Browsable(true),
        Description("每页显示的记录数,0为打印模式,如有查询条件请将其id=tjWhere"),
        Category("分页"),
        DefaultValue(20)]
        public int PageSize
        {
            get
            {
                object obj = ViewState["PageSize"];
                return (obj == null) ? 20 : (int)obj;
            }
            set
            {
                if (value != 20)
                    ViewState["PageSize"] = value;
            }
        }

        /// <summary>
        /// 获取或设置当前显示页的索引。
        /// </summary>
        [ReadOnly(true),
        Browsable(false),
        Description("当前显示页的索引"),
        Category("分页"),
        DefaultValue(1),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public int CurrentPageIndex
        {
            get
            {
                object cpage = ViewState["CurrentPageIndex"];
                int pindex = (cpage == null) ? 1 : (int)cpage;
                if (pindex > PageCount && PageCount > 0)
                    return PageCount;
                else if (pindex < 1)
                    return 1;
                return pindex;
            }
            set
            {
                ViewState["CurrentPageIndex"] = value;
            }
        }

        /// <summary>
        /// 获取或设置需要分页的所有记录的总数。
        /// </summary>
        [Browsable(false),
        Description("要分页的所有记录的总数,该值须在程序运行时设置,默认值为0。"),
        Category("分页"),
        DefaultValue(0)]
        public int RecordCount
        {
            get
            {
                object obj = ViewState["Recordcount"];
                return (obj == null) ? 0 : (int)obj;
            }
            set { ViewState["Recordcount"] = value; }
        }

        /// <summary>
        /// 获取所有要分页的记录需要的总页数。
        /// </summary>
        [Browsable(false),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
        public int PageCount
        {
            get
            {
                if (PageSize > 0)
                {
                    return (int)Math.Ceiling((double)RecordCount / (double)PageSize);
                }
                else
                {
                    return 1;
                }
            }
        }

        /// <summary>
        /// 获取或设置一个值,该值指示 MyPager 服务器控件是否向发出请求的客户端保持自己的视图状态,该属性经重写后不允许设为false。
        /// </summary>
        [Browsable(false),
        Description("是否启用控件的视图状态,该属性的值必须为true,不允许用户设置。"),
        DefaultValue(true),
        Category("Behavior")]
        public override bool EnableViewState
        {
            get
            {
                return base.EnableViewState;
            }
            set
            {
                base.EnableViewState = true;
            }
        }

        #endregion

        #region 重写控件的方法

        /// <summary>
        /// 重写<see cref="System.Web.UI.WebControls.WebControl.AddAttributesToRender"/> 方法,验证是否有form(runat=server)控件
        /// </summary>
        /// <param name="writer"></param>
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            if (this.Page != null)
                this.Page.VerifyRenderingInServerForm(this);
            base.AddAttributesToRender(writer);
        }

        /// <summary>
        /// 重写OnLoad 方法。
        /// </summary>
        /// <param name="e">包含事件数据的 <see cref="EventArgs"/> 对象。</param>
        protected override void OnLoad(EventArgs e)
        {
            if (Page.IsPostBack)
            {
                string p = Page.Request.Form[this.UniqueID + "_Page"];
                if (p != null)
                {
                    try
                    {
                        int n = int.Parse(p);
                        PageSize = n;
                        if (n > 0 && n < 20)
                        {
                            Page.Session["PageSize"] = n;
                        }
                    }
                    catch
                    {
                        ;
                    }
                }
                else if (PageSize == 0)
                {
                    try
                    {
                        if (Page.Session["PageSize"] != null)
                        {
                            PageSize = Convert.ToInt32(Page.Session["PageSize"]);
                        }
                        else if (Page.Application["PageSize"] != null)
                        {
                            PageSize = Convert.ToInt32(Page.Application["PageSize"]);
                        }
                    }
                    catch
                    {
                        ;
                    }
                }
            }
            base.OnLoad(e);
        }
        /// <summary>
        /// 重写<see cref="System.Web.UI.Control.Render"/>方法。
        /// </summary>
        protected override void Render(HtmlTextWriter writer)
        {
            int pageCount = PageCount;
            if (pageCount > 0)
            {
                writer.Write(@"<table width=100% border=0 cellpadding=0 cellspacing=0><tr><td align=left> 【共<span style='FONT-WEIGHT:bold;color:red'>" + RecordCount.ToString() + "</span>条");
                if (pageCount > 1)
                {
                    writer.Write(@"<input type=text name='" + this.UniqueID + "_Page' size=2 value=" + PageSize.ToString() + " style='color:blue;border:1px solid #666666' οnblur=/"" + Page.ClientScript.GetPostBackEventReference(this, "1") + "/" οnkeydοwn=/"if (event.keyCode==13) this.blur()/" οnkeypress=/"if (event.keyCode>=48 && event.keyCode<=57) {event.returnValue=true;} else {event.returnValue=false;}/">条/页 共<span style='FONT-WEIGHT:bold;color:red'>" + pageCount.ToString() + "</span>页】</td>");
                }
                else
                {
                    writer.Write("】</td>");
                }
                if (EnablePrint && NumericButtonCount > 0)
                {
                    if (pageCount > 1)
                    {
                        writer.Write("<td> <input type=button value=打印模式 οnclick=/"this.form." + this.UniqueID + "_Page.value=0;" + Page.ClientScript.GetPostBackEventReference(this, "1") + "/"></td>");
                    }
                    else
                    {
                        writer.Write(" <td align=center><div id=tdPrint><input type=button value=打印 οnclick=/"var obj=document.all['tjWhere'];if (obj) obj.style.display='none';document.all['tdPrint'].style.display='none';document.execCommand('print');if (obj) obj.style.display='';document.all['tdPrint'].style.display='';/"> <input type=button value=另存为 οnclick=/"var obj=document.all['tjWhere'];if (obj) obj.style.display='none';document.all['tdPrint'].style.display='none';document.execCommand('saveas');if (obj) obj.style.display='';document.all['tdPrint'].style.display='';/">");
                        if (PageSize == 0)
                        {
                            writer.Write(" <input type=button value=分页模式 οnclick=" + Page.ClientScript.GetPostBackEventReference(this, "1") + ">");
                        }
                        writer.Write("</div></td>");
                    }
                }
                if (pageCount > 1)
                {
                    int p = CurrentPageIndex;
                    writer.Write("<td align=right>");
                    if (p == 1)
                    {
                        writer.Write("<a disabled><font face=webdings>9</font></a> ");
                    }
                    else
                    {
                        writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, "1") + "><font face=webdings>9</font></a> ");
                    }
                    int n = NumericButtonCount;
                    if (n == 0)
                    {
                        if (p == 1)
                        {
                            writer.Write("<a disabled><font face=webdings>7</font></a> ");
                        }
                        else
                        {
                            writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p - 1).ToString()) + "><font face=webdings>7</font></a> ");
                        }
                        writer.Write("<span style='FONT-WEIGHT:bold;color:red'>" + p.ToString() + "</b></span> ");

                        if (p == pageCount)
                        {
                            writer.Write("<a disabled><font face=webdings>8</font></a> ");
                        }
                        else
                        {
                            writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, (p + 1).ToString()) + "><font face=webdings>8</font></a> ");
                        }
                    }
                    else
                    {
                        if (n > 5 && p > 100)
                        {
                            n = 5;
                        }
                        int pageoffset = 0;
                        int endpage = 0;
                        if (pageCount <= n)
                        {
                            pageoffset = 0;
                            endpage = pageCount;
                        }
                        else
                        {
                            if (p <= n / 2)
                            {
                                pageoffset = 0;
                            }
                            else
                            {
                                pageoffset = p - 1 - n / 2;
                            }
                            if ((pageoffset + n) > pageCount)
                            {
                                pageoffset = pageCount - n;
                                endpage = pageCount;
                            }
                            else
                            {
                                endpage = pageoffset + n;
                            }
                        }

                        for (int i = pageoffset + 1; i <= endpage; i++)
                        {
                            if (i == p)
                            {
                                writer.Write("<span style='FONT-WEIGHT:bold;color:red'>" + i.ToString() + "</span> ");
                            }
                            else
                            {
                                writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, i.ToString()) + ">[" + i.ToString() + "]</a> ");
                            }
                        }
                    }
                    if (p == pageCount)
                    {
                        writer.Write("<a disabled><font face=webdings>:</font></a> ");
                    }
                    else
                    {
                        writer.Write("<a href=" + Page.ClientScript.GetPostBackClientHyperlink(this, pageCount.ToString()) + "><font face=webdings>:</font></a> ");
                    }
                    writer.Write("</td>");
                }
                writer.Write("</tr></table>");
            }
            else if (Page.IsPostBack)
            {
                writer.Write("<div align=center style='FONT-WEIGHT:bold;color:red;FONT-SIZE:15px'><br><br>没有满足条件的记录!</div>");
            }
            else
            {
                writer.Write("<div align='center' style='FONT-WEIGHT:bold;color:blue;FONT-SIZE:15px'><br><br>请设定查询条件后点[查询]!</div>");
            }
        }
        #endregion

        #region 事件

        #region IPostBackEventHandler事件

        /// <summary>
        /// 实现<see cref="IPostBackEventHandler"/> 接口,使 <see cref="MyPager"/> 控件能够处理将窗体发送到服务器时引发的事件。
        /// </summary>
        /// <param name="args"></param>
        public void RaisePostBackEvent(string args)
        {
            int pageIndex = 1;
            try
            {
                if (args != null)
                {
                    pageIndex = int.Parse(args);
                }
            }
            catch
            {
                pageIndex = CurrentPageIndex;
            }
            OnPageChanged(new PageChangedEventArgs(pageIndex));

        }

        #endregion

        #region PageChanged Event
        /// <summary>
        /// 当页导航元素之一被单击或用户手工输入页索引提交时发生。
        /// </summary>
        public event PageChangedEventHandler PageChanged;


        /// <summary>
        /// 引发 <see cref="PageChanged"/> 事件。这使您可以为事件提供自定义处理程序。
        /// </summary>
        /// <param name="e">一个 <see cref="PageChangedEventArgs"/>,它包含事件数据。</param>
        protected virtual void OnPageChanged(PageChangedEventArgs e)
        {
            if (this.PageChanged != null)
                PageChanged(this, e);
        }

        #endregion

        #endregion
    }
    #region PageChangedEventHandler 代理
    /// <summary>
    /// 表示处理 <see cref="MyPager.PageChanged"/> 事件的方法。
    /// </summary>
    public delegate void PageChangedEventHandler(object src, PageChangedEventArgs e);

    #endregion

    #region PageChangedEventArgs 类
    /// <summary>
    /// 为 <see cref="MyPager"/> 控件的 <see cref="MyPager.PageChanged"/> 事件提供数据。无法继承此类。
    /// </summary>
    /// <remarks>
    /// 当 <see cref="MyPager"/> 控件的页导航元素之一被单击或用户输入页索引提交时引发 <see cref="MyPager.PageChanged"/> 事件。
    /// <p>有关 PageChangedEventArgs 实例的初始属性值列表,请参阅 PageChangedEventArgs 构造函数。</p>
    /// </remarks>
    public sealed class PageChangedEventArgs : EventArgs
    {
        private readonly int _newpageindex;

        /// <summary>
        /// 使用新页面索引初始化 PageChangedEventArgs 类的新实例。
        /// </summary>
        /// <param name="newPageIndex">用户从 <see cref="MyPager"/> 控件的页选择元素选定的或在页索引文本框中手工输入的页的索引。</param>
        public PageChangedEventArgs(int newPageIndex)
        {
            this._newpageindex = newPageIndex;
        }

        /// <summary>
        /// 获取用户在 <see cref="MyPager"/> 控件的页选择元素中选定的或在页索引文本框中手工输入的页的索引。
        /// </summary>
        public int NewPageIndex
        {
            get { return _newpageindex; }
        }
    }
    #endregion

/// <summary>
 /// <see cref="MyPager"/> 服务器控件设计器。
 /// </summary>
    public class MyPagerDesigner : System.Web.UI.Design.WebControls.PanelContainerDesigner
    {
        /// <summary>
        /// 自动大小
        /// </summary>
        public override bool AllowResize
        {
            get { return false; }
        }
       
  /// <summary>
  /// 获取用于在设计时表示关联控件的 HTML。
  /// </summary>
  /// <returns>用于在设计时表示控件的 HTML。</returns>
  public override string GetDesignTimeHtml()
  {
   
   MyPager wb=(MyPager)Component;
   wb.RecordCount=225;
   StringWriter sw=new StringWriter();
   HtmlTextWriter writer=new HtmlTextWriter(sw);
   wb.RenderControl(writer);
   return sw.ToString();
  }

  /// <summary>
  /// 获取在呈现控件时遇到错误后在设计时为指定的异常显示的 HTML。
  /// </summary>
  /// <param name="e">要为其显示错误信息的异常。</param>
  /// <returns>设计时为指定的异常显示的 HTML。</returns>
  protected override string GetErrorDesignTimeHtml(Exception e)
  {
   string errorstr="创建控件时出错:"+e.Message;
   return CreatePlaceHolderDesignTimeHtml(errorstr);
  }
    }

}


构建一个WEB开发的基础框架(主要包括数据库处理、页面框架及工具类),形成ASP.NET信息管理系统快速开发架构。
一、框架实现了基于XML定制的列表查询及图表展现
二、列表实现了复杂查询条件、合并行列(分组求和的处理)、汇总行及钻取数据和图表的钻取
三、编辑配置支持单表数据的增加和修改,针对开发人员实现的编辑页面可方便扩展主表新增字段
使开发人员专注于系统的业务实现,节省开发时间,提高开发效率

试用登录http://121.18.78.216/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值