//此源代码仅供学习参考,不得用作任何商业用途;
  //若需修改并重新编译该控件,请保留完整的源代码的版权信息!
  //有关控件升级及新控件发布信息,请留意 www.webdiyer.com 。
  using System;
  using System.IO;
  using System.Web;
  using System.Web.UI;
  using System.Web.UI.WebControls;
  using System.Web.UI.HtmlControls;
  using System.Collections.Specialized;
  using System.Text;
  using System.ComponentModel;
  using System.ComponentModel.Design;
  using System.Collections;
  namespace Wuqi.Webdiyer
  {
  #region AspNetPager Server Control
  
  #region 控件说明及示例
  /// <summary>
  /// 用于ASP.NET Web应用程序中对数据进行分页的的服务器控件。
  /// </summary>
  /// <remarks>不同于DataGrid控件,AspNetPager分页控件本身并不显示任何数据,而只显示页导航元素,数据在页面上的显示方式与该控件无关。该控件可以为DataGrid、DataList、Repeater以及自定义控件进行分页,配合Sql存储过程,分页性能较使用 DataGrid分页有明显提升,尤其是当数据量大时性能可提升数倍!
  /// <p>AspNetPager 2.0 中新增了通过Url来分页的功能,这使得访问者可以直接输入相应的Url来访问任何页面,并且搜索引擎也可以直接检索每个页面,若使用DataGrid的分页功能,这是无法实现的。</p>
  /// <p>要使用 AspNetPager 分页控件,必须最少指定它的 <see cref="RecordCount"/> 属性,指定并编写 <see cref="PageChanged"/> 事件的处理程序。
  /// <see cref="RecordCount"/> 属性指定要分页的所有数据的总项数,若未指定该值或该值小于等于 <see cref="PageSize"/> ,则AspNetPager控件不会显示任何内容。
  /// 若未指定并编写 <see cref="PageChanged"/> 事件处理程序,则当用户点击页导航元素或在页索引文本框中手式输入页索引并提交时AspNetPager不会跳转到指定的页。
  /// AspNetPager控件的分页方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件处理程序中将传递事件数据的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/>值赋给 AspNetPager的 <see cref="CurrentPageIndex"/>属性,然后重新将新的数据与数据显示控件绑定。 </p></remarks>
  /// <example>以下示例说明如何用AspNetPager对DataGrid进行分页。
  /// <code><![CDATA[
  ///<%@ Page Language="C#"%>
  ///<%@ Import Namespace="System.Data"%>
  ///<%@Import Namespace="System.Data.SqlClient"%>
  ///<%@Import Namespace="System.Configuration"%>
  ///<%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
  ///<HTML>
  ///<HEAD>
  ///<TITLE>Welcome to Webdiyer.com </TITLE>
  /// <script runat="server">
  /// SqlConnection conn;
  /// SqlCommand cmd;
  /// void Page_Load(object src,EventArgs e)
  /// {
  /// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
  /// if(!Page.IsPostBack)
  /// {
  /// cmd=new SqlCommand("GetNews",conn);
  /// cmd.CommandType=CommandType.StoredProcedure;
  /// cmd.Parameters.Add("@pageindex",1);
  /// cmd.Parameters.Add("@pagesize",1);
  /// cmd.Parameters.Add("@docount",true);
  /// conn.Open();
  /// pager.RecordCount=(int)cmd.ExecuteScalar();
  /// conn.Close();
  /// BindData();
  /// }
  /// }
  ///
  /// void BindData()
  /// {
  /// cmd=new SqlCommand("GetNews",conn);
  /// cmd.CommandType=CommandType.StoredProcedure;
  /// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
  /// cmd.Parameters.Add("@pagesize",pager.PageSize);
  /// cmd.Parameters.Add("@docount",false);
  /// conn.Open();
  /// dataGrid1.DataSource=cmd.ExecuteReader();
  /// dataGrid1.DataBind();
  /// conn.Close();
  /// pager.CustomInfoText="记录总数:<font color="blue"><b>"+pager.RecordCount.ToString()+"</b></font>";
  /// pager.CustomInfoText+=" 总页数:<font color="blue"><b>"+pager.PageCount.ToString()+"</b></font>";
  /// pager.CustomInfoText+=" 当前页:<font color="red"><b>"+pager.CurrentPageIndex.ToString()+"</b></font>";
  /// }
  /// void ChangePage(object src,PageChangedEventArgs e)
  /// {
  /// pager.CurrentPageIndex=e.NewPageIndex;
  /// BindData();
  /// }
  /// </script>
  /// <meta http-equiv="Content-Language" content="zh-cn">
  /// <meta http-equiv="content-type" content="text/html;charset=gb2312">
  /// <META NAME="Generator" CONTENT="EditPlus">
  /// <META NAME="Author" CONTENT="Webdiyer(yhaili@21cn.com)">
  /// </HEAD>
  /// <body>
  /// <form runat="server" ID="Form1">
  /// <asp:DataGrid id="dataGrid1" runat="server" />
  /// <Webdiyer:AspNetPager id="pager"
  /// runat="server"
  /// PageSize="8"
  /// NumericButtonCount="8"
  /// ShowCustomInfoSection="left"
  /// PagingButtonSpacing="0"
  /// ShowInputBox="always"
  /// CssClass="mypager"
  /// HorizontalAlign="right"
  /// OnPageChanged="ChangePage"
  /// SubmitButtonText="转到"
  /// NumericButtonTextFormatString="[{0}]"/>
  /// </form>
  /// </body>
  ///</HTML>
  /// ]]>
  /// </code>
  /// <p>下面是该示例所用的Sql Server存储过程:</p>
  /// <code>
  /// <![CDATA[
  ///CREATE procedure GetNews
  /// (@pagesize int,
  /// @pageindex int,
  /// @docount bit)
  /// as
  /// set nocount on
  /// if(@docount=1)
  /// select count(id) from news
  /// else
  /// begin
  /// declare @indextable table(id int identity(1,1),nid int)
  /// declare @PageLowerBound int
  /// declare @PageUpperBound int
  /// set @PageLowerBound=(@pageindex-1)*@pagesize
  /// set @PageUpperBound=@PageLowerBound+@pagesize
  /// set rowcount @PageUpperBound
  /// insert into @indextable(nid) select id from news order by addtime desc
  /// select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
  /// and t.id>@PageLowerBound and t.id < = @PageUpperBound order by t.id
  /// end
  /// set nocount off
  ///GO
  /// ]]>
  /// </code></example>
  #endregion
  [DefaultProperty("PageSize")]
  [DefaultEvent("PageChanged")]
  [ParseChildren(false)]
  [PersistChildren(false)]
  [Description("专用于ASP.Net Web应用程序的分页控件")]
  [Designer(typeof(PagerDesigner))]
  [ToolboxData("<{0}:AspNetPager runat=server></{0}:AspNetPager>")]
  public class AspNetPager:Panel,INamingContainer,IPostBackEventHandler,IPostBackDataHandler
  {
  private string cssClassName;
  private string urlPageIndexName="page";
  private bool urlPaging=false;
  private string inputPageIndex;
  private string currentUrl=null;
  private NameValueCollection urlParams=null; #region Properties #region Navigation Buttons /// <summary>
  /// 获取或设置一个值,该值批示当鼠标指针悬停在导航按钮上时是否显示工具提示。
  /// </summary>
  [Browsable(true),
  Category("导航按钮"), DefaultValue(true), Description("指定当鼠标停留在导航按钮上时,是否显示工具提示")]
  public bool ShowNavigationToolTip
  {
  get
  {
  object obj=ViewState["ShowNavigationToolTip"];
  return (obj==null)?true:(bool)obj;
  }
  set
  {
  ViewState["ShowNavigationToolTip"]=value;
  }
  } /// <summary>
  /// 获取或设置导航按钮工具提示文本的格式。
  /// </summary>
  [Browsable(true),
  Category("导航按钮"),
  DefaultValue("转到第{0}页"),
  Description("页导航按钮工具提示文本的格式")]
  public string NavigationToolTipTextFormatString
  {
  get
  {
  object obj=ViewState["NavigationToolTipTextFormatString"];
  return (obj==null)?"转到第{0}页":(string)obj;
  }
  set
  {
  string tip=value;
  if(tip.Trim().Length<1&&tip.IndexOf("{0}")<0)
  tip="{0}";
  ViewState["NavigationToolTipTextFormatString"]=tip;
  }
  } /// <summary>
  /// 获取或设置一个值,该值指示是否将页索引按钮用中文数字代替。
  /// </summary>
  /// <remarks>
  /// 将该值设为true并且未使用图片按钮时,页索引按钮中的数值1、2、3等将会被中文字符一、
二、三等代替。
  /// </remarks>
  [Browsable(true),
  Category("导航按钮"),
  DefaultValue(false),
  Description("是否将页索引数值按钮用中文数字一、二、三等代替")]
  public bool ChinesePageIndex
  {
  get
  {
  object obj=ViewState["ChinesePageIndex"];
  return (obj==null)?false:(bool)obj;
  }
  set
  {
  ViewState["ChinesePageIndex"]=value;
  }
  } /// <summary>
  /// 获取或设置页索引数值导航按钮上文字的显示格式。
  /// </summary>
  /// <value>
  /// 字符串,指定页索引数值按钮上文字的显示格式,默认值为<see cref="String.Empty"/>,即未设置该属性。</value>
  /// <remarks>
  /// 使用NumericButtonTextFormatString属性指定页索引数值按钮的显示格式,如未设置该值时索引按钮文本将会是:1 2 3 ...,设置该值将改变索引按钮文本的显示格式,
  /// 如将该值设为“[{0}]”则索引文本会显示为:[1] [2] [3] ...,将该值设为“-{0}-”则会使索引文本变为:-1- -2- -3- ...。
  /// </remarks>
  [Browsable(true),
  DefaultValue(""),
  Category("导航按钮"),
  Description("页索引数值按钮上文字的显示格式")]
  public string NumericButtonTextFormatString
  {
  get
  {
  object obj=ViewState["NumericButtonTextFormatString"];
  return (obj==null)?String.Empty:(string)obj;
  }
  set
  {
  ViewState["NumericButtonTextFormatString"]=value;
  }
  } /// <summary>
  /// 获取或设置分页导航按钮的类型,即使用文字还是图片。
  /// </summary>
  /// <remarks>
  /// 要使用图片按钮,您需要准备以下图片:从0到9的十个数值图片(当ShowPageIndex设为true时),第一页、上一页、下一页、最后一页及更多页(...)五个按钮图片(当ShowFirstLast及ShowPrevNext都设为true时),
  /// 若需要使当前页索引的数值按钮不同于别的页索引数值按钮,则还需准备当前页索引的按钮图片;
  /// 若需要使已禁用的第一页、上一页、下一页及最后一页按钮图片不同于正常的按钮图片,则还需准备这四个按钮在禁用状态下的图片;
  /// <p><b>图片文件的命名规则如下:</b></p>
  /// <p>从0到9十张数值按钮图片必须命名为“数值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用设置,
  /// ButtonImageExtension是图片文件的后缀名,如 .gif或 .jpg等可以在浏览器中显示的任何图片文件类型。如页索引“1”的图片文件可命名为“1.gif”或“1.jpg”,
  /// 当您有两套或更多套图片文件时,可以通过指定ButtonImageNameExtension属性值来区分不同套的图片,如第一套图片可以不用设 ButtonImageNameExtension,则图片文件名类似于“1.gif”、“2.gif”等等,而第二套图片则设置 ButtonImageNameExtension为“f”,图片文件名类似于“1f.gif”,“2f.gif”等等。</p>
  /// <p>第一页按钮的图片文件名以“first”开头,上一页按钮图片名以“prev”开头,下一页按钮图片名以“next”开头,最后一页按钮图片名以“last”开头,更多页按钮图片名以“more”开头,是否使用ButtonImageNameExtension取决于数值按钮的设置及是否有更多套图片。</p>
  /// </remarks>
  /// <example>
  /// 以下代码片段示例如果使用图片按钮:
  /// <p>
  /// <code><![CDATA[
  /// <Webdiyer:AspNetPager runat="server"
  /// id="pager1"
  /// OnPageChanged="ChangePage"
  /// PagingButtonType="image"
  /// ImagePath="images"
  /// ButtonImageNameExtension="n"
  /// DisabledButtonImageNameExtension="g"
  /// ButtonImageExtension="gif"
  /// CpiButtonImageNameExtension="r"
  /// PagingButtonSpacing=5/>
  /// ]]>
  /// </code>
  /// </p>
  /// </example>
  [Browsable(true),
  DefaultValue(PagingButtonType.Text),
  Category("导航按钮"),
  Description("分页导航按钮的类型,是使用文字还是图片")]
  public PagingButtonType PagingButtonType
  {
  get
  {
  object obj=ViewState["PagingButtonType"];
  return (obj==null)?PagingButtonType.Text:(PagingButtonType)obj;
  }
  set
  {
  ViewState["PagingButtonType"]=value;
  }
  } /// <summary>
  /// 获取或设置页导航数值按钮的类型,该值仅当PagingButtonType设为Image时才有效。
  /// </summary>
  /// <remarks>
  /// 当您将PagingButtonType设为Image当又不想让页索引数值按钮使用图片时,可以将该值设为Text,这会使页索引数据按钮使用文本而不是图片按钮。
  /// </remarks>
  [Browsable(true),
  DefaultValue(PagingButtonType.Text),
  Category("导航按钮"),
  Description("页导航数值按钮的类型")]
  public PagingButtonType NumericButtonType
  {
  get
  {
  object obj=ViewState["NumericButtonType"];
  return (obj==null)?PagingButtonType:(PagingButtonType)obj;
  }
  set
  {
  ViewState["NumericButtonType"]=value;
  }
  } /// <summary>
  /// 获取或设置第一页、上一页、下一页和最后一页按钮的类型,该值仅当PagingButtonType设为Image时才有效。
posted on 2007-06-15 08:39  E商.NET  阅读(654)  评论(0)    收藏  举报