AspNetPager分頁(yè)控件源代碼(Version 4.2)第1/2頁(yè)
更新時(shí)間:2007年04月28日 00:00:00 作者:
//AspNetPager分頁(yè)控件源代碼(Version 4.2):
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應(yīng)用程序中對(duì)數(shù)據(jù)進(jìn)行分頁(yè)的的服務(wù)器控件。
/// </summary>
/// <remarks>不同于DataGrid控件,AspNetPager分頁(yè)控件本身并不顯示任何數(shù)據(jù),而只顯示頁(yè)導(dǎo)航元素,數(shù)據(jù)在頁(yè)面上的顯示方式與該控件無(wú)關(guān)。該控件可以為DataGrid、DataList、Repeater以及自定義控件進(jìn)行分頁(yè),配合Sql存儲(chǔ)過程,分頁(yè)性能較使用DataGrid分頁(yè)有明顯提升,尤其是當(dāng)數(shù)據(jù)量大時(shí)性能可提升數(shù)倍!
/// <p>AspNetPager 2.0 中新增了通過Url來分頁(yè)的功能,這使得訪問者可以直接輸入相應(yīng)的Url來訪問任何頁(yè)面,并且搜索引擎也可以直接檢索每個(gè)頁(yè)面,若使用DataGrid的分頁(yè)功能,這是無(wú)法實(shí)現(xiàn)的。</p>
/// <p>要使用 AspNetPager 分頁(yè)控件,必須最少指定它的 <see cref="RecordCount"/> 屬性,指定并編寫 <see cref="PageChanged"/> 事件的處理程序。
/// <see cref="RecordCount"/> 屬性指定要分頁(yè)的所有數(shù)據(jù)的總項(xiàng)數(shù),若未指定該值或該值小于等于 <see cref="PageSize"/> ,則AspNetPager控件不會(huì)顯示任何內(nèi)容。
/// 若未指定并編寫 <see cref="PageChanged"/> 事件處理程序,則當(dāng)用戶點(diǎn)擊頁(yè)導(dǎo)航元素或在頁(yè)索引文本框中手式輸入頁(yè)索引并提交時(shí)AspNetPager不會(huì)跳轉(zhuǎn)到指定的頁(yè)。
/// AspNetPager控件的分頁(yè)方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件處理程序中將傳遞事件數(shù)據(jù)的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/>值賦給 AspNetPager的 <see cref="CurrentPageIndex"/>屬性,然后重新將新的數(shù)據(jù)與數(shù)據(jù)顯示控件綁定。 </p></remarks>
/// <example>以下示例說明如何用AspNetPager對(duì)DataGrid進(jìn)行分頁(yè)。
/// <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="記錄總數(shù):<font color=\"blue\"><b>"+pager.RecordCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 總頁(yè)數(shù):<font color=\"blue\"><b>"+pager.PageCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 當(dāng)前頁(yè):<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="轉(zhuǎn)到"
/// NumericButtonTextFormatString="[{0}]"/>
///
/// </form>
/// </body>
///</HTML>
/// ]]>
/// </code>
/// <p>下面是該示例所用的Sql Server存儲(chǔ)過程:</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應(yīng)用程序的分頁(yè)控件")]
[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>
/// 獲取或設(shè)置一個(gè)值,該值批示當(dāng)鼠標(biāo)指針懸停在導(dǎo)航按鈕上時(shí)是否顯示工具提示。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(true),
Description("指定當(dāng)鼠標(biāo)停留在導(dǎo)航按鈕上時(shí),是否顯示工具提示")]
public bool ShowNavigationToolTip
{
get
{
object obj=ViewState["ShowNavigationToolTip"];
return (obj==null)?true:(bool)obj;
}
set
{
ViewState["ShowNavigationToolTip"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置導(dǎo)航按鈕工具提示文本的格式。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue("轉(zhuǎn)到第{0}頁(yè)"),
Description("頁(yè)導(dǎo)航按鈕工具提示文本的格式")]
public string NavigationToolTipTextFormatString
{
get
{
object obj=ViewState["NavigationToolTipTextFormatString"];
return (obj==null)?"轉(zhuǎn)到第{0}頁(yè)":(string)obj;
}
set
{
string tip=value;
if(tip.Trim().Length<1&&tip.IndexOf("{0}")<0)
tip="{0}";
ViewState["NavigationToolTipTextFormatString"]=tip;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否將頁(yè)索引按鈕用中文數(shù)字代替。
/// </summary>
/// <remarks>
/// 將該值設(shè)為true并且未使用圖片按鈕時(shí),頁(yè)索引按鈕中的數(shù)值1、2、3等將會(huì)被中文字符一、二、三等代替。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(false),
Description("是否將頁(yè)索引數(shù)值按鈕用中文數(shù)字一、二、三等代替")]
public bool ChinesePageIndex
{
get
{
object obj=ViewState["ChinesePageIndex"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["ChinesePageIndex"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引數(shù)值導(dǎo)航按鈕上文字的顯示格式。
/// </summary>
/// <value>
/// 字符串,指定頁(yè)索引數(shù)值按鈕上文字的顯示格式,默認(rèn)值為<see cref="String.Empty"/>,即未設(shè)置該屬性。</value>
/// <remarks>
/// 使用NumericButtonTextFormatString屬性指定頁(yè)索引數(shù)值按鈕的顯示格式,如未設(shè)置該值時(shí)索引按鈕文本將會(huì)是:1 2 3 ...,設(shè)置該值將改變索引按鈕文本的顯示格式,
/// 如將該值設(shè)為“[{0}]”則索引文本會(huì)顯示為:[1] [2] [3] ...,將該值設(shè)為“-{0}-”則會(huì)使索引文本變?yōu)椋?1- -2- -3- ...。
/// </remarks>
[Browsable(true),
DefaultValue(""),
Category("導(dǎo)航按鈕"),
Description("頁(yè)索引數(shù)值按鈕上文字的顯示格式")]
public string NumericButtonTextFormatString
{
get
{
object obj=ViewState["NumericButtonTextFormatString"];
return (obj==null)?String.Empty:(string)obj;
}
set
{
ViewState["NumericButtonTextFormatString"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置分頁(yè)導(dǎo)航按鈕的類型,即使用文字還是圖片。
/// </summary>
/// <remarks>
/// 要使用圖片按鈕,您需要準(zhǔn)備以下圖片:從0到9的十個(gè)數(shù)值圖片(當(dāng)ShowPageIndex設(shè)為true時(shí)),第一頁(yè)、上一頁(yè)、下一頁(yè)、最后一頁(yè)及更多頁(yè)(...)五個(gè)按鈕圖片(當(dāng)ShowFirstLast及ShowPrevNext都設(shè)為true時(shí)),
/// 若需要使當(dāng)前頁(yè)索引的數(shù)值按鈕不同于別的頁(yè)索引數(shù)值按鈕,則還需準(zhǔn)備當(dāng)前頁(yè)索引的按鈕圖片;
/// 若需要使已禁用的第一頁(yè)、上一頁(yè)、下一頁(yè)及最后一頁(yè)按鈕圖片不同于正常的按鈕圖片,則還需準(zhǔn)備這四個(gè)按鈕在禁用狀態(tài)下的圖片;
/// <p><b>圖片文件的命名規(guī)則如下:</b></p>
/// <p>從0到9十張數(shù)值按鈕圖片必須命名為“數(shù)值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用設(shè)置,
/// ButtonImageExtension是圖片文件的后綴名,如 .gif或 .jpg等可以在瀏覽器中顯示的任何圖片文件類型。如頁(yè)索引“1”的圖片文件可命名為“1.gif”或“1.jpg”,
/// 當(dāng)您有兩套或更多套圖片文件時(shí),可以通過指定ButtonImageNameExtension屬性值來區(qū)分不同套的圖片,如第一套圖片可以不用設(shè)ButtonImageNameExtension,則圖片文件名類似于“1.gif”、“2.gif”等等,而第二套圖片則設(shè)置ButtonImageNameExtension為“f”,圖片文件名類似于“1f.gif”,“2f.gif”等等。</p>
/// <p>第一頁(yè)按鈕的圖片文件名以“first”開頭,上一頁(yè)按鈕圖片名以“prev”開頭,下一頁(yè)按鈕圖片名以“next”開頭,最后一頁(yè)按鈕圖片名以“l(fā)ast”開頭,更多頁(yè)按鈕圖片名以“more”開頭,是否使用ButtonImageNameExtension取決于數(shù)值按鈕的設(shè)置及是否有更多套圖片。</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("導(dǎo)航按鈕"),
Description("分頁(yè)導(dǎo)航按鈕的類型,是使用文字還是圖片")]
public PagingButtonType PagingButtonType
{
get
{
object obj=ViewState["PagingButtonType"];
return (obj==null)?PagingButtonType.Text:(PagingButtonType)obj;
}
set
{
ViewState["PagingButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)導(dǎo)航數(shù)值按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image當(dāng)又不想讓頁(yè)索引數(shù)值按鈕使用圖片時(shí),可以將該值設(shè)為Text,這會(huì)使頁(yè)索引數(shù)據(jù)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
DefaultValue(PagingButtonType.Text),
Category("導(dǎo)航按鈕"),
Description("頁(yè)導(dǎo)航數(shù)值按鈕的類型")]
public PagingButtonType NumericButtonType
{
get
{
object obj=ViewState["NumericButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NumericButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置第一頁(yè)、上一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image但又不想讓第一頁(yè)、下一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕使用圖片,則可以將該值設(shè)為Text,這會(huì)使前面的四個(gè)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("第一頁(yè)、上一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕的類型")]
public PagingButtonType NavigationButtonType
{
get
{
object obj=ViewState["NavigationButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NavigationButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置“更多頁(yè)”(...)按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image但又不想讓更多頁(yè)(...)按鈕使用圖片時(shí),可以將此值設(shè)為Text,這會(huì)使更多頁(yè)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("“更多頁(yè)”(...)按鈕的類型")]
public PagingButtonType MoreButtonType
{
get
{
object obj=ViewState["MoreButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["MoreButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置分頁(yè)導(dǎo)航按鈕之間的間距。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(typeof(Unit),"5px"),
Description("分頁(yè)導(dǎo)航按鈕之間的間距")]
public Unit PagingButtonSpacing
{
get
{
object obj=ViewState["PagingButtonSpacing"];
return (obj==null)?Unit.Pixel(5):(Unit.Parse(obj.ToString()));
}
set
{
ViewState["PagingButtonSpacing"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示第一頁(yè)和最后一頁(yè)按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示第一頁(yè)和最后一頁(yè)按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowFirstLast
{
get
{
object obj=ViewState["ShowFirstLast"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowFirstLast"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示上一頁(yè)和下一頁(yè)按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示上一頁(yè)和下一頁(yè)按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowPrevNext
{
get
{
object obj=ViewState["ShowPrevNext"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPrevNext"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示頁(yè)索引數(shù)值按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示數(shù)值按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowPageIndex
{
get
{
object obj=ViewState["ShowPageIndex"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPageIndex"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為第一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("第一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">9</font>")]
public string FirstPageText
{
get
{
object obj=ViewState["FirstPageText"];
return (obj==null)?"<font face=\"webdings\">9</font>":(string)obj;
}
set{ViewState["FirstPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為上一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("上一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">3</font>")]
public string PrevPageText
{
get
{
object obj=ViewState["PrevPageText"];
return (obj==null)?"<font face=\"webdings\">3</font>":(string)obj;
}
set{ViewState["PrevPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為下一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("下一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">4</font>")]
public string NextPageText
{
get
{
object obj=ViewState["NextPageText"];
return (obj==null)?"<font face=\"webdings\">4</font>":(string)obj;
}
set{ViewState["NextPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為最后一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("最后一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">:</font>")]
public string LastPageText
{
get
{
object obj=ViewState["LastPageText"];
return (obj==null)?"<font face=\"webdings\">:</font>":(string)obj;
}
set{ViewState["LastPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置在 <see cref="AspNetPager"/> 控件的頁(yè)導(dǎo)航元素中同時(shí)顯示的數(shù)值按鈕的數(shù)目。
/// </summary>
[Browsable(true),
Description("要顯示的頁(yè)索引數(shù)值按鈕的數(shù)目"),
Category("導(dǎo)航按鈕"),
DefaultValue(10)]
public int NumericButtonCount
{
get
{
object obj=ViewState["NumericButtonCount"];
return (obj==null)?10:(int)obj;
}
set{ViewState["NumericButtonCount"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指定是否顯示已禁用的按鈕。
/// </summary>
/// <remarks>
/// 該值用來指定是否顯示已禁用的分頁(yè)導(dǎo)航按鈕,當(dāng)當(dāng)前頁(yè)為第一頁(yè)時(shí),第一頁(yè)和上一頁(yè)按鈕將被禁用,當(dāng)當(dāng)前頁(yè)為最后一頁(yè)時(shí),下一頁(yè)和最后一頁(yè)按鈕將被禁用,被禁用的按鈕沒有鏈接,在按鈕上點(diǎn)擊也不會(huì)有任何作用。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
Description("是否顯示已禁用的按鈕"),
DefaultValue(true)]
public bool ShowDisabledButtons
{
get
{
object obj=ViewState["ShowDisabledButtons"];
return (obj==null)?true:(bool)obj;
}
set
{
ViewState["ShowDisabledButtons"]=value;
}
}
#endregion
#region Image Buttons
/// <summary>
/// 獲取或設(shè)置當(dāng)使用圖片按鈕時(shí),圖片文件的路徑。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
Description("當(dāng)使用圖片按鈕時(shí),指定圖片文件的路徑"),
DefaultValue(null)]
public string ImagePath
{
get
{
string imgPath=(string)ViewState["ImagePath"];
if(imgPath!=null)
imgPath=this.ResolveUrl(imgPath);
return imgPath;
}
set
{
string imgPath=value.Trim().Replace("\\","/");
ViewState["ImagePath"]=(imgPath.EndsWith("/"))?imgPath:imgPath+"/";
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)使用圖片按鈕時(shí),圖片的類型,如gif或jpg,該值即圖片文件的后綴名。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
DefaultValue(".gif"),
Description("當(dāng)使用圖片按鈕時(shí),圖片的類型,如gif或jpg,該值即圖片文件的后綴名")]
public string ButtonImageExtension
{
get
{
object obj=ViewState["ButtonImageExtension"];
return (obj==null)?".gif":(string)obj;
}
set
{
string ext=value.Trim();
ViewState["ButtonImageExtension"]=(ext.StartsWith("."))?ext:("."+ext);
}
}
/// <summary>
/// 獲取或設(shè)置自定義圖片文件名的后綴字符串,以區(qū)分不同類型的按鈕圖片。
/// </summary>
/// <remarks><note>注意:</note>該值不是文件后綴名,而是為區(qū)分不同的圖片文件而在圖片名中加入的字符串,如:
/// 當(dāng)前有兩套按鈕圖片,其中一套中的“1”的圖片名可為“1f.gif”,另一套中的“1”的圖片名可起為“1n.gif”,其中的f和n即為ButtonImageNameExtension。</remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("自定義圖片文件名的后綴字符串(非文件后綴名),如圖片“1f.gif”的ButtonImageNameExtension即為“f”")]
public string ButtonImageNameExtension
{
get
{
return (string)ViewState["ButtonImageNameExtension"];
}
set
{
ViewState["ButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)前頁(yè)索引按鈕的圖片名后綴。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="PagingButtonType"/> 設(shè)為 Image 時(shí),該屬性允許您設(shè)置當(dāng)前頁(yè)索引數(shù)值按鈕使用的圖片名后綴字符,因此可以使當(dāng)前頁(yè)索引按鈕與其它頁(yè)索引按鈕使用不同的圖片,若未設(shè)置該值,則默認(rèn)值為<see cref="ButtonImageNameExtension"/>,即當(dāng)前頁(yè)索引按鈕與其它頁(yè)索引按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("當(dāng)前頁(yè)索引按鈕的圖片名后綴字符串")]
public string CpiButtonImageNameExtension
{
get
{
object obj=ViewState["CpiButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["CpiButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置已禁用的頁(yè)導(dǎo)航按鈕圖片名后綴字符串。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="PagingButtonType"/> 設(shè)為 Image 時(shí), 該值允許您設(shè)置已禁用(即沒有鏈接,因而點(diǎn)擊后無(wú)反應(yīng))的頁(yè)導(dǎo)航按鈕(包括第一頁(yè)、上一頁(yè)、下一頁(yè)、最后一頁(yè)四個(gè)按鈕)的圖片文件名后綴字符串,因此可以使已禁用的頁(yè)導(dǎo)航按鈕不同于正常的頁(yè)導(dǎo)航按鈕。若未設(shè)置該值,則默認(rèn)值為<see cref="ButtonImageNameExtension"/>,即已禁用的頁(yè)導(dǎo)航按鈕與正常的頁(yè)導(dǎo)航按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("已禁用的頁(yè)導(dǎo)航按鈕的圖片名后綴字符串")]
public string DisabledButtonImageNameExtension
{
get
{
object obj=ViewState["DisabledButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["DisabledButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 指定當(dāng)使用圖片按鈕時(shí),圖片的對(duì)齊方式。
/// </summary>
[Browsable(true),
Description("指定當(dāng)使用圖片按鈕時(shí),圖片的對(duì)齊方式"),
DefaultValue(ImageAlign.Baseline),
Category("圖片按鈕")]
public ImageAlign ButtonImageAlign
{
get
{
object obj=ViewState["ButtonImageAlign"];
return (obj==null)?ImageAlign.Baseline:(ImageAlign)obj;
}
set{ViewState["ButtonImageAlign"]=value;}
}
#endregion
#region Paging
/// <summary>
/// 獲取或設(shè)置是否啟用url來傳遞分頁(yè)信息。
/// </summary>
/// <remarks>
/// 啟用Url分頁(yè)方式是將用戶欲訪問的頁(yè)索引通過Url來傳遞,由于該分頁(yè)方式不使用頁(yè)面向自身回發(fā)來傳遞數(shù)據(jù),
/// 所以每次分頁(yè)時(shí)所有的數(shù)據(jù)都恢復(fù)為初始值或需要重新獲取。使用Url分頁(yè)方式不支持動(dòng)態(tài)改變分頁(yè)控件的屬性值,
/// 因暫時(shí)無(wú)法將新的屬性值通過Url來傳遞給下一頁(yè)。
/// </remarks>
/// <example>以下示例說明如何用AspNetPager的Url分頁(yè)方式對(duì)DataGrid進(jìn)行分頁(yè)(使用Access數(shù)據(jù)庫(kù)):
/// <code><![CDATA[
///<%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
///<%@Import Namespace="System.Data.OleDb"%>
///<%@ Import Namespace="System.Data"%>
///<%@ Page Language="C#" debug=true%>
///<HTML>
/// <HEAD>
/// <TITLE>Welcome to Webdiyer.com </TITLE>
/// <script runat="server">
/// OleDbConnection conn;
/// OleDbCommand cmd;
/// void Page_Load(object src,EventArgs e){
/// conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("access/aspnetpager.mdb"));
/// if(!Page.IsPostBack){
/// cmd=new OleDbCommand("select count(newsid) from wqnews",conn);
/// conn.Open();
/// pager.RecordCount=(int)cmd.ExecuteScalar();
/// conn.Close();
/// BindData();
/// }
/// }
///
/// void BindData(){
/// cmd=new OleDbCommand("select newsid,heading,source,addtime from wqnews order by addtime desc",conn);
/// OleDbDataAdapter adapter=new OleDbDataAdapter(cmd);
/// DataSet ds=new DataSet();
/// adapter.Fill(ds,pager.PageSize*(pager.CurrentPageIndex-1),pager.PageSize,"news");
/// dg.DataSource=ds.Tables["news"];
/// dg.DataBind();
/// }
///
/// 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">
/// <h2 align="center">AspNetPager分頁(yè)示例</h2>
/// <asp:DataGrid id="dg" runat="server"
/// Width="760" CellPadding="4" Align="center" />
///
/// <Webdiyer:AspNetPager runat="server" id="pager"
/// OnPageChanged="ChangePage"
/// HorizontalAlign="center"
/// style="MARGIN-TOP:10px;FONT-SIZE:16px"
/// PageSize="8"
/// ShowInputBox="always"
/// SubmitButtonStyle="border:1px solid #000066;height:20px;width:30px"
/// InputBoxStyle="border:1px #0000FF solid;text-align:center"
/// SubmitButtonText="轉(zhuǎn)到"
/// UrlPaging="true"
/// UrlPageIndexName="pageindex" />
/// </form>
/// </body>
///</HTML>
/// ]]></code>
/// </example>
[Browsable(true),
Category("分頁(yè)"),
DefaultValue(false),
Description("是否使用url傳遞分頁(yè)信息的方式來分頁(yè)")]
public bool UrlPaging
{
get
{
return urlPaging;
}
set
{
urlPaging=value;
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)啟用Url分頁(yè)方式時(shí),在url中表示要傳遞的頁(yè)索引的參數(shù)的名稱。
/// </summary>
/// <remarks>
/// 該屬性允許您自定義通過Url傳遞頁(yè)索引時(shí)表示要傳遞的頁(yè)索引的參數(shù)的名稱,以避免與現(xiàn)有的參數(shù)名重復(fù)。
/// <p>該屬性的默認(rèn)值是“page”,即通過Url分頁(yè)時(shí),顯示在瀏覽器地址欄中的Url類似于:</p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2
/// <p>如將該值改為“pageindex”,則上面的Url將變?yōu)椋?lt;/p><p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2 </p>
/// </remarks>
[Browsable(true),
DefaultValue("page"),
Category("分頁(yè)"),
Description("當(dāng)啟用Url分頁(yè)方式時(shí),顯示在url中表示要傳遞的頁(yè)索引的參數(shù)的名稱")]
public string UrlPageIndexName
{
get{return urlPageIndexName;}
set{urlPageIndexName=value;}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)前顯示頁(yè)的索引。
/// </summary>
///<remarks>使用此屬性來確定在 AspNetPager 控件中當(dāng)前顯示的頁(yè),當(dāng)前顯示的頁(yè)的數(shù)字索引將以紅色字體加粗顯示。此屬性還用于以編程的方式控制所顯示的頁(yè)。
///<p> <b>注意:</b>不同于DataGrid控件的CurrentPageIndex,AspNetPager的CurrentPageIndex屬性是從1開始的。</p></remarks>
[ReadOnly(true),
Browsable(false),
Description("當(dāng)前顯示頁(yè)的索引"),
Category("分頁(yè)"),
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
{
int cpage=value;
if(cpage<1)
cpage=1;
else if(cpage>this.PageCount)
cpage=this.PageCount;
ViewState["CurrentPageIndex"]=cpage;
}
}
/// <summary>
/// 獲取或設(shè)置需要分頁(yè)的所有記錄的總數(shù)。
/// </summary>
/// <remarks>
/// 當(dāng)頁(yè)面第一次加載時(shí),應(yīng)以編程方式將從存儲(chǔ)過程或Sql語(yǔ)句中返回的數(shù)據(jù)表中所有要分頁(yè)的記錄的總數(shù)賦予該屬性,AspNetPager會(huì)將其保存的ViewState中并在頁(yè)面回發(fā)時(shí)從ViewState中獲取該值,因此避免了每次分頁(yè)都要訪問數(shù)據(jù)庫(kù)而影響分頁(yè)性能。AspNetPager根據(jù)要分頁(yè)的所有數(shù)據(jù)的總項(xiàng)數(shù)和 <see cref="PageSize"/> 屬性來計(jì)算顯示所有數(shù)據(jù)需要的總頁(yè)數(shù),即 <see cref="PageCount"/>的值。
/// </remarks>
/// <example>
/// 下面的示例顯示如何以編程方式將從Sql語(yǔ)句返回的記錄總數(shù)賦給該屬性:
/// <p>
/// <code><![CDATA[
/// <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("select count(id) from news",conn);
/// conn.Open();
/// pager.RecordCount=(int)cmd.ExecuteScalar();
/// conn.Close();
/// BindData();
/// }
/// }
///
/// void BindData()
/// {
/// cmd=new SqlCommand("GetPagedNews",conn);
/// cmd.CommandType=CommandType.StoredProcedure;
/// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
/// cmd.Parameters.Add("@pagesize",pager.PageSize);
/// conn.Open();
/// dataGrid1.DataSource=cmd.ExecuteReader();
/// dataGrid1.DataBind();
/// conn.Close();
/// }
/// 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="before"
/// ShowInputBox="always"
/// CssClass="mypager"
/// HorizontalAlign="center"
/// OnPageChanged="ChangePage" />
///
/// </form>
/// </body>
///</HTML>
/// ]]>
/// </code></p>
/// <p>本示例使用的存儲(chǔ)過程代碼如下:</p>
/// <code><![CDATA[
///CREATE procedure GetPagedNews
/// (@pagesize int,
/// @pageindex int)
/// as
/// set nocount on
/// 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.title,O.source,O.addtime from news O,@indextable t where O.id=t.nid
/// and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
/// set nocount off
///GO
/// ]]>
/// </code>
/// </example>
[Browsable(false),
Description("要分頁(yè)的所有記錄的總數(shù),該值須在程序運(yùn)行時(shí)設(shè)置,默認(rèn)值為225是為設(shè)計(jì)時(shí)支持而設(shè)置的參照值。"),
Category("Data"),
DefaultValue(225)]
public int RecordCount
{
get
{
object obj=ViewState["Recordcount"];
return (obj==null)?0:(int)obj;
}
set{ViewState["Recordcount"]=value;}
}
/// <summary>
/// 獲取當(dāng)前頁(yè)之后未顯示的頁(yè)的總數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PagesRemain
{
get
{
return PageCount-CurrentPageIndex;
}
}
/// <summary>
/// 獲取或設(shè)置每頁(yè)顯示的項(xiàng)數(shù)。
/// </summary>
/// <remarks>
/// 該值獲取或設(shè)置數(shù)據(jù)呈現(xiàn)控件每次要顯示數(shù)據(jù)表中的的數(shù)據(jù)的項(xiàng)數(shù),AspNetPager根據(jù)該值和 <see cref="RecordCount"/> 來計(jì)算顯示所有數(shù)據(jù)需要的總頁(yè)數(shù),即 <see cref="PageCount"/>的值。</remarks>
/// <example>以下示例將 <see cref="AspNetPager"/> 設(shè)置為允許每頁(yè)顯示8條數(shù)據(jù):
/// <code>
/// <![CDATA[
/// ...
/// <Webdiyer:AspNetPager id="pager" runat="server" PageSize=8 OnPageChanged="ChangePage"/>
/// ...
/// ]]></code></example>
[Browsable(true),
Description("每頁(yè)顯示的記錄數(shù)"),
Category("分頁(yè)"),
DefaultValue(10)]
public int PageSize
{
get
{
object obj=ViewState["PageSize"];
return (obj==null)?10:(int)obj;
}
set
{
ViewState["PageSize"]=value;
}
}
/// <summary>
/// 獲取在當(dāng)前頁(yè)之后還未顯示的剩余記錄的項(xiàng)數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int RecordsRemain
{
get
{
if(CurrentPageIndex<PageCount)
return RecordCount-(CurrentPageIndex*PageSize);
return 0;}
}
/// <summary>
/// 獲取所有要分頁(yè)的記錄需要的總頁(yè)數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PageCount
{
get{return (int)Math.Ceiling((double)RecordCount/(double)PageSize);}
}
#endregion
#region TextBox and Submit Button
/// <summary>
/// 獲取或設(shè)置頁(yè)索引文本框的顯示方式。
/// </summary>
/// <remarks>
/// 頁(yè)索引文件框允許用戶手式輸入要訪問的頁(yè)的索引,當(dāng)頁(yè)數(shù)非常多時(shí),顯示頁(yè)索引文本框非常方便用戶跳轉(zhuǎn)到指定的頁(yè),默認(rèn)情況下,該文本框只有在總頁(yè)數(shù)大于或等于 <see cref="ShowBoxThreshold"/> 的值時(shí)才顯示,否則不顯示,要想該文本框任何時(shí)候都顯示,請(qǐng)將其值設(shè)為Always,若希望任何時(shí)候都不顯示,則應(yīng)設(shè)為Never。
///</remarks>
[Browsable(true),
Description("指定頁(yè)索引文本框的顯示方式"),
Category("文本框及提交按鈕"),
DefaultValue(ShowInputBox.Auto)]
public ShowInputBox ShowInputBox
{
get
{
object obj=ViewState["ShowInputBox"];
return (obj==null)?ShowInputBox.Auto:(ShowInputBox)obj;
}
set{ViewState["ShowInputBox"]=value;}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于頁(yè)索引輸入文本框的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于頁(yè)索引輸入文本框的CSS類名")]
public string InputBoxClass
{
get
{
return (string)ViewState["InpubBoxClass"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引輸入文本框的CSS樣式文本。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于頁(yè)索引輸入文本框的CSS樣式文本")]
public string InputBoxStyle
{
get
{
return (string)ViewState["InputBoxStyle"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引頁(yè)索引輸入文本框前的文本字符串值。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("頁(yè)索引輸入文本框前的文本內(nèi)容字符串")]
public string TextBeforeInputBox
{
get
{
return (string)ViewState["TextBeforeInputBox"];
}
set
{
ViewState["TextBeforeInputBox"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引文本輸入框后的文本內(nèi)容字符串值。
/// </summary>
[Browsable(true),
DefaultValue(null),
Category("文本框及提交按鈕"),
Description("頁(yè)索引輸入文本框后的文本內(nèi)容字符串")]
public string TextAfterInputBox
{
get
{
return (string)ViewState["TextAfterInputBox"];
}
set
{
ViewState["TextAfterInputBox"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置提交按鈕上的文本。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue("go"),
Description("提交按鈕上的文本")]
public string SubmitButtonText
{
get
{
object obj=ViewState["SubmitButtonText"];
return (obj==null)?"go":(string)obj;
}
set
{
if(value.Trim().Length>0)
ViewState["SubmitButtonText"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于提交按鈕的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于提交按鈕的CSS類名")]
public string SubmitButtonClass
{
get
{
return (string)ViewState["SubmitButtonClass"];
}
set
{
ViewState["SubmitButtonClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于提交按鈕的CSS樣式。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于提交按鈕的CSS樣式")]
public string SubmitButtonStyle
{
get
{
return (string)ViewState["SubmitButtonStyle"];
}
set
{
ViewState["SubmitButtonStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置自動(dòng)顯示頁(yè)索引輸入文本框的最低起始頁(yè)數(shù)。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="ShowInputBox"/> 設(shè)為Auto(默認(rèn))并且要分頁(yè)的數(shù)據(jù)的總頁(yè)數(shù)達(dá)到該值時(shí)會(huì)自動(dòng)顯示頁(yè)索引輸入文本框,默認(rèn)值為30。該選項(xiàng)當(dāng) <see cref="ShowInputBox"/> 設(shè)為Never或Always時(shí)沒有任何作用。
/// </remarks>
[Browsable(true),
Description("指定當(dāng)ShowInputBox設(shè)為ShowInputBox.Auto時(shí),當(dāng)總頁(yè)數(shù)達(dá)到多少時(shí)才顯示頁(yè)索引輸入文本框"),
Category("文本框及提交按鈕"),
DefaultValue(30)]
public int ShowBoxThreshold
{
get
{
object obj=ViewState["ShowBoxThreshold"];
return (obj==null)?30:(int)obj;
}
set{ViewState["ShowBoxThreshold"]=value;}
}
#endregion
#region CustomInfoSection
/// <summary>
/// 獲取或設(shè)置顯示用戶自定義信息區(qū)的方式。
/// </summary>
/// <remarks>
/// 該屬性值設(shè)為L(zhǎng)eft或Right時(shí)會(huì)在分頁(yè)導(dǎo)航元素左邊或右邊劃出一個(gè)專門的區(qū)域來顯示有關(guān)用戶自定義信息,設(shè)為Never時(shí)不顯示。
/// </remarks>
[Browsable(true),
Description("顯示當(dāng)前頁(yè)和總頁(yè)數(shù)信息,默認(rèn)值為不顯示,值為ShowCustomInfoSection.Left時(shí)將顯示在頁(yè)索引前,為ShowCustomInfoSection.Right時(shí)將顯示在頁(yè)索引后"),
DefaultValue(ShowCustomInfoSection.Never),
Category("自定義信息區(qū)")]
public ShowCustomInfoSection ShowCustomInfoSection
{
get
{
object obj=ViewState["ShowCustomInfoSection"];
return (obj==null)?ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;
}
set{ViewState["ShowCustomInfoSection"]=value;}
}
/// <summary>
/// 獲取或設(shè)置用戶自定義信息區(qū)文本的對(duì)齊方式。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(HorizontalAlign.Left),
Description("用戶自定義信息區(qū)文本的對(duì)齊方式")]
public HorizontalAlign CustomInfoTextAlign
{
get
{
object obj=ViewState["CustomInfoTextAlign"];
return (obj==null)?HorizontalAlign.Left:(HorizontalAlign)obj;
}
set
{
ViewState["CustomInfoTextAlign"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置用戶自定義信息區(qū)的寬度。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(typeof(Unit),"40%"),
Description("用戶自定義信息區(qū)的寬度")]
public Unit CustomInfoSectionWidth
{
get
{
object obj=ViewState["CustomInfoSectionWidth"];
return (obj==null)?Unit.Percentage(40):(Unit)obj;
}
set
{
ViewState["CustomInfoSectionWidth"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于用戶自定義信息區(qū)的級(jí)聯(lián)樣式表類名。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("應(yīng)用于用戶自定義信息區(qū)的級(jí)聯(lián)樣式表類名")]
public string CustomInfoClass
{
get
{
object obj=ViewState["CustomInfoClass"];
return (obj==null)?CssClass:(string)obj;
}
set
{
ViewState["CustomInfoClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本。
/// </summary>
/// <value>字符串值,要應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本。</value>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本")]
public string CustomInfoStyle
{
get
{
object obj=ViewState["CustomInfoStyle"];
return (obj==null)?GetStyleString():(string)obj;
}
set
{
ViewState["CustomInfoStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置在顯示在用戶自定義信息區(qū)的用戶自定義文本。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("要顯示在用戶自定義信息區(qū)的用戶自定義信息文本")]
public string CustomInfoText
{
get
{
return (string)ViewState["CustomInfoText"];
}
set
{
ViewState["CustomInfoText"]=value;
}
}
#endregion
#region Others
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指定是否總是顯示AspNetPager分頁(yè)按件,即使要分頁(yè)的數(shù)據(jù)只有一頁(yè)。
/// </summary>
/// <remarks>
/// 默認(rèn)情況下,當(dāng)要分頁(yè)的數(shù)據(jù)小于兩頁(yè)時(shí),AspNetPager不會(huì)在頁(yè)面上顯示任何內(nèi)容,將此屬性值設(shè)為true時(shí),即使總頁(yè)數(shù)只有一頁(yè),AspNetPager也將顯示分頁(yè)導(dǎo)航元素。
/// </remarks>
[Browsable(true),
Category("Behavior"),
DefaultValue(false),
Description("總是顯示分頁(yè)控件,即使要分頁(yè)的數(shù)據(jù)只要一頁(yè)")]
public bool AlwaysShow
{
get
{
object obj=ViewState["AlwaysShow"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["AlwaysShow"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置由 AspNetPager 服務(wù)器控件在客戶端呈現(xiàn)的級(jí)聯(lián)樣式表 (CSS) 類。
/// </summary>
[Browsable(true),
Description("應(yīng)用于控件的CSS類名"),
Category("Appearance"),
DefaultValue(null)]
public override string CssClass
{
get{return base.CssClass;}
set
{
base.CssClass=value;
cssClassName=value;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示 AspNetPager 服務(wù)器控件是否向發(fā)出請(qǐng)求的客戶端保持自己的視圖狀態(tài),該屬性經(jīng)重寫后不允許設(shè)為false。
/// </summary>
/// <remarks><see cref="AspNetPager"/> 服務(wù)器控件將一些重要的分頁(yè)信息保存在ViewState中,當(dāng)使用Url分頁(yè)方式時(shí),雖然視圖狀態(tài)在分頁(yè)過程中沒有任何作用,但若當(dāng)前頁(yè)需要回發(fā),則必須啟用視圖狀態(tài)以便分頁(yè)控件能在頁(yè)面回發(fā)后獲取回發(fā)前的分頁(yè)狀態(tài);當(dāng)通過頁(yè)面回發(fā)(PostBack)的方式來分頁(yè)時(shí),要使AspNetPager正常工作,必須啟用視圖狀態(tài)。
/// <p><note>該屬性并不能禁止用戶用<![CDATA[<%@Page EnableViewState=false%> ]]>頁(yè)指令來禁用整個(gè)頁(yè)面的視圖狀態(tài),當(dāng)使用此指令并且設(shè)置AspNetPager通過頁(yè)面回發(fā)來分頁(yè)時(shí),AspNetPager因?yàn)闊o(wú)法獲取保存的信息而不能正常工作。</note></p></remarks>
[Browsable(false),
Description("是否啟用控件的視圖狀態(tài),該屬性的值必須為true,不允許用戶設(shè)置。"),
DefaultValue(true),
Category("Behavior")]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState=true;
}
}
#endregion
#endregion
#region Control Rendering Logic
/// <summary>
/// 重寫 <see cref="System.Web.UI.Control.OnLoad"/> 方法。
/// </summary>
/// <param name="e">包含事件數(shù)據(jù)的 <see cref="EventArgs"/> 對(duì)象。</param>
protected override void OnLoad(EventArgs e)
{
if(urlPaging)
{
currentUrl=Page.Request.Path;
urlParams=Page.Request.QueryString;
string pageIndex=Page.Request.QueryString[urlPageIndexName];
int index=1;
try
{
index=int.Parse(pageIndex);
}
catch{}
OnPageChanged(new PageChangedEventArgs(index));
}
else
{
inputPageIndex=Page.Request.Form[this.UniqueID+"_input"];
}
base.OnLoad(e);
}
/// <summary>
/// 重寫<see cref="System.Web.UI.Control.OnPreRender"/>方法。
/// </summary>
/// <param name="e">包含事件數(shù)據(jù)的 <see cref="EventArgs"/> 對(duì)象。</param>
protected override void OnPreRender(EventArgs e)
{
if(PageCount>1)
{
string checkscript="<script language=\"Javascript\">function doCheck(el){var r=new RegExp(\"^\\\\s*(\\\\d+)\\\\s*$\");if(r.test(el.value)){if(RegExp.$1<1||RegExp.$1>"+PageCount.ToString()+"){alert(\"頁(yè)數(shù)必須介于1和"+PageCount.ToString()+"之間!\");document.all[\'"+this.UniqueID+"_input\'].select();return false;}return true;}alert(\"輸入的頁(yè)索引無(wú)效!\");document.all[\'"+this.UniqueID+"_input\'].select();return false;}</script>";
if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&&PageCount>=ShowBoxThreshold))
{
if(!Page.IsClientScriptBlockRegistered("checkinput"))
Page.RegisterClientScriptBlock("checkinput",checkscript);
string script="<script language=\"javascript\" > <!-- \nfunction BuildUrlString(key,value){ var loc=window.location.search.substring(1); var params=loc.split(\"&\"); if(params.length<=1||(params.length==2&¶ms[0].toLowerCase()==key)) return location.pathname+\"?\"+key+\"=\"+value; var newparam=\"\"; var flag=false; for(i=0;i<params.length;i++){ if(params[i].split(\"=\")[0].toLowerCase()==key.toLowerCase()){ params[i]=key+\"=\"+value; flag=true; break; } } for(i=0;i<params.length;i++){ newparam+=params[i]+\"&\"; } if(flag) newparam=newparam.substring(0,newparam.length-1); else newparam+=key+\"=\"+value; return location.pathname+\"?\"+newparam; } \n//--> </script>";
if(!Page.IsClientScriptBlockRegistered("BuildUrlScript"))
Page.RegisterClientScriptBlock("BuildUrlScript",script);
}
}
base.OnPreRender(e);
}
///<summary>
///重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderBeginTag"/> 方法,將 <see cref="AspNetPager"/> 控件的 HTML 開始標(biāo)記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
public override void RenderBeginTag(HtmlTextWriter writer)
{
bool showPager=(PageCount>1||(PageCount<=1&&AlwaysShow));
writer.WriteLine();
writer.Write("<!------------------------------ ");
writer.Write("AspNetPager V4.2 Start");
writer.WriteLine(" ------------------------------>");
writer.Write("<!-------------------- ");
writer.Write("Copyright:2003 Webdiyer(www.webdiyer.com)");
writer.Write(" ---------------------");
writer.WriteLine(">");
base.RenderBeginTag(writer);
if(!showPager)
{
writer.Write("<!-----因?yàn)榭傢?yè)數(shù)只有一頁(yè),并且AlwaysShow屬性設(shè)為false,AspNetPager沒有顯示任何內(nèi)容,若要在總頁(yè)數(shù)只有一頁(yè)的情況下顯示AspNetPager,請(qǐng)將AlwaysShow屬性設(shè)為true!");
writer.Write("----->");
}
if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&&showPager)
{
writer.AddAttribute(HtmlTextWriterAttribute.Width,"100%");
writer.AddAttribute(HtmlTextWriterAttribute.Style,GetStyleString());
if(Height!=Unit.Empty)
writer.AddStyleAttribute(HtmlTextWriterStyle.Height,Height.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
WriteCellAttributes(writer,true);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
}
}
///<summary>
///重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderEndTag"/> 方法,將 <see cref="AspNetPager"/> 控件的 HTML 結(jié)束標(biāo)記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
public override void RenderEndTag(HtmlTextWriter writer)
{
if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&&PageCount>1)
{
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
base.RenderEndTag(writer);
writer.WriteLine();
writer.Write("<!------------------------------- ");
writer.Write("AspNetPager V4.2 End");
writer.Write(" --------------------------------");
writer.WriteLine(">");
writer.WriteLine();
}
/// <summary>
/// 重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderContents"/> 方法,將控件的內(nèi)容呈現(xiàn)到指定 <see cref="System.Web.UI.HtmlTextWriter"/> 的編寫器中。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
protected override void RenderContents(HtmlTextWriter writer)
{
if(PageCount<=1&&!AlwaysShow)
return;
if(ShowCustomInfoSection==ShowCustomInfoSection.Left)
{
writer.Write(CustomInfoText);
writer.RenderEndTag();
WriteCellAttributes(writer,false);
writer.AddAttribute(HtmlTextWriterAttribute.Class,CssClass);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
}
int midpage=(int)((CurrentPageIndex-1)/NumericButtonCount);
int pageoffset=midpage*NumericButtonCount;
int endpage=((pageoffset+NumericButtonCount)>PageCount)?PageCount:(pageoffset+NumericButtonCount);
this.CreateNavigationButton(writer,"first");
this.CreateNavigationButton(writer,"prev");
if(ShowPageIndex)
{
if(CurrentPageIndex>NumericButtonCount)
CreateMoreButton(writer,pageoffset);
for(int i=pageoffset+1;i<=endpage;i++)
{
CreateNumericButton(writer,i);
}
if(PageCount>NumericButtonCount&&endpage<PageCount)
CreateMoreButton(writer,endpage+1);
}
this.CreateNavigationButton(writer,"next");
this.CreateNavigationButton(writer,"last");
if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&&PageCount>=ShowBoxThreshold))
{
writer.Write(" ");
if(TextBeforeInputBox!=null)
writer.Write(TextBeforeInputBox);
writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"30px");
writer.AddAttribute(HtmlTextWriterAttribute.Value,inputPageIndex);
if(InputBoxStyle!=null&&InputBoxStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,InputBoxStyle);
if(InputBoxClass!=null&&InputBoxClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,InputBoxClass);
if(PageCount<=1&&AlwaysShow)
writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly,"true");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID+"_input");
string scriptRef="doCheck(document.all[\'"+this.UniqueID+"_input\'])";
string postRef="if(event.keyCode==13){if("+scriptRef+")__doPostBack(\'"+this.UniqueID+"\',document.all[\'"+this.UniqueID+"_input\'].value);else{event.returnValue=false;}}";
string keydownScript="if(event.keyCode==13){if("+scriptRef+"){event.returnValue=false;document.all[\'"+this.UniqueID+"\'][1].click();}else{event.returnValue=false;}}";
string clickScript="if("+scriptRef+"){location.href=BuildUrlString(\'"+urlPageIndexName+"\',document.all[\'"+this.UniqueID+"_input\'].value)}";
writer.AddAttribute("onkeydown",(urlPaging==true)?keydownScript:postRef);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
if(TextAfterInputBox!=null)
writer.Write(TextAfterInputBox);
writer.AddAttribute(HtmlTextWriterAttribute.Type,(urlPaging==true)?"Button":"Submit");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value,SubmitButtonText);
if(SubmitButtonClass!=null&&SubmitButtonClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,SubmitButtonClass);
if(SubmitButtonStyle!=null&&SubmitButtonStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,SubmitButtonStyle);
if(PageCount<=1&&AlwaysShow)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,(urlPaging==true)?clickScript:"return "+scriptRef);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();}
if(ShowCustomInfoSection==ShowCustomInfoSection.Right)
{
writer.RenderEndTag();
WriteCellAttributes(writer,false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(CustomInfoText);
}
}
#endregion
#region Private Helper Functions
/// <summary>
/// 將基控件的Style轉(zhuǎn)換為CSS字符串。
/// </summary>
/// <returns></returns>
private string GetStyleString()
{
if(Style.Count>0)
{
string stl=null;
string[] skeys=new string[Style.Count];
Style.Keys.CopyTo(skeys,0);
for(int i=0;i<skeys.Length;i++)
{
stl+=String.Concat(skeys[i],":",Style[skeys[i]],";");
}
return stl;
}
return null;
}
/// <summary>
/// 為用戶自定義信息區(qū)和頁(yè)導(dǎo)航按鈕區(qū)和td添加屬性。
/// </summary>
/// <param name="writer"></param>
/// <param name="leftCell">是否為第一個(gè)td</param>
private void WriteCellAttributes(HtmlTextWriter writer,bool leftCell)
{
string customUnit=CustomInfoSectionWidth.ToString();
if(ShowCustomInfoSection==ShowCustomInfoSection.Left&&leftCell||ShowCustomInfoSection==ShowCustomInfoSection.Right&&!leftCell)
{
if(CustomInfoClass!=null&&CustomInfoClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,CustomInfoClass);
if(CustomInfoStyle!=null&&CustomInfoStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,CustomInfoStyle);
writer.AddAttribute(HtmlTextWriterAttribute.Valign,"bottom");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,customUnit);
writer.AddAttribute(HtmlTextWriterAttribute.Align,CustomInfoTextAlign.ToString().ToLower());
}
else
{
if(CustomInfoSectionWidth.Type==UnitType.Percentage)
{
customUnit=(Unit.Percentage(100-CustomInfoSectionWidth.Value)).ToString();
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,customUnit);
}
writer.AddAttribute(HtmlTextWriterAttribute.Valign,"bottom");
writer.AddAttribute(HtmlTextWriterAttribute.Align,HorizontalAlign.ToString().ToLower());
}
writer.AddAttribute(HtmlTextWriterAttribute.Nowrap,"true");
}
/// <summary>
/// 獲取分頁(yè)導(dǎo)航按鈕的超鏈接字符串。
/// </summary>
/// <param name="pageIndex">該分頁(yè)按鈕相對(duì)應(yīng)的頁(yè)索引。</param>
/// <returns>分頁(yè)導(dǎo)航按鈕的超鏈接字符串。</returns>
private string GetHrefString(int pageIndex)
{
if(urlPaging)
{
NameValueCollection col=new NameValueCollection();
col.Add(urlPageIndexName,pageIndex.ToString());
return BuildUrlString(col);
}
return Page.GetPostBackClientHyperlink(this,pageIndex.ToString());
}
/// <summary>
/// 當(dāng)使用Url分頁(yè)方式時(shí),在當(dāng)前Url上加入分頁(yè)參數(shù),若該參數(shù)存在,則改變其值。
/// </summary>
/// <param name="col">要加入到新Url中的參數(shù)名和值的集合。</param>
/// <returns>分頁(yè)導(dǎo)航按鈕的超鏈接字符串,包括分頁(yè)參數(shù)。</returns>
private string BuildUrlString(NameValueCollection col)
{
int i;
string tempstr="";
if(urlParams==null||urlParams.Count<=0)
{
for(i=0;i<col.Count;i++)
{
tempstr+=String.Concat("&",col.Keys[i],"=",col[i]);
}
return String.Concat(currentUrl,"?",tempstr.Substring(1));
}
NameValueCollection newCol=new NameValueCollection(urlParams);
string[] newColKeys=newCol.AllKeys;
for(i=0;i<newColKeys.Length;i++)
{
newColKeys[i]=newColKeys[i].ToLower();
}
for(i=0;i<col.Count;i++)
{
if(Array.IndexOf(newColKeys,col.Keys[i].ToLower())<0)
newCol.Add(col.Keys[i],col[i]);
else
newCol[col.Keys[i]]=col[i];
}
System.Text.StringBuilder sb=new System.Text.StringBuilder();
for(i=0;i<newCol.Count;i++)
{
sb.Append("&");
sb.Append(newCol.Keys[i]);
sb.Append("=");
sb.Append(newCol[i]);
}
return String.Concat(currentUrl,"?",sb.ToString().Substring(1));
}
/// <summary>
/// 創(chuàng)建第一頁(yè)、上一頁(yè)、下一頁(yè)及最后一頁(yè)分頁(yè)按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="btnname">分頁(yè)按鈕名。</param>
private void CreateNavigationButton(HtmlTextWriter writer,string btnname)
{
if(!ShowFirstLast&&(btnname=="first"||btnname=="last"))
return;
if(!ShowPrevNext&&(btnname=="prev"||btnname=="next"))
return;
string linktext="";
bool disabled;
int pageIndex;
bool imgButton=(PagingButtonType==PagingButtonType.Image&&NavigationButtonType==PagingButtonType.Image);
if(btnname=="prev"||btnname=="first")
{
disabled=(CurrentPageIndex<=1);
if(!ShowDisabledButtons&&disabled)
return;
pageIndex=(btnname=="first")?1:(CurrentPageIndex-1);
if(imgButton)
{
if(!disabled)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
writer.RenderEndTag();
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,DisabledButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
else
{
linktext=(btnname=="prev")?PrevPageText:FirstPageText;
if(disabled)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
else
{
WriteCssClass(writer);
AddToolTip(writer,pageIndex);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
}
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(linktext);
writer.RenderEndTag();
}
}
else
{
disabled=(CurrentPageIndex>=PageCount);
if(!ShowDisabledButtons&&disabled)
return;
pageIndex=(btnname=="last")?PageCount:(CurrentPageIndex+1);
if(imgButton)
{
if(!disabled)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
writer.RenderEndTag();
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,DisabledButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
else
{
linktext=(btnname=="next")?NextPageText:LastPageText;
if(disabled)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
else
{
WriteCssClass(writer);
AddToolTip(writer,pageIndex);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
}
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(linktext);
writer.RenderEndTag();
}
}
WriteButtonSpace(writer);
}
/// <summary>
/// 寫入CSS類名。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
private void WriteCssClass(HtmlTextWriter writer)
{
if(cssClassName!=null&&cssClassName.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,cssClassName);
}
/// <summary>
/// 加入導(dǎo)航按鈕提示文本。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="pageIndex">導(dǎo)航按鈕對(duì)應(yīng)的頁(yè)索引。</param>
private void AddToolTip(HtmlTextWriter writer,int pageIndex)
{
if(ShowNavigationToolTip)
{
writer.AddAttribute(HtmlTextWriterAttribute.Title,String.Format(NavigationToolTipTextFormatString,pageIndex));
}
}
/// <summary>
/// 創(chuàng)建分頁(yè)數(shù)值導(dǎo)航按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="index">要?jiǎng)?chuàng)建按鈕的頁(yè)索引的值。</param>
private void CreateNumericButton(HtmlTextWriter writer,int index)
{
bool isCurrent=(index==CurrentPageIndex);
if(PagingButtonType==PagingButtonType.Image&&NumericButtonType==PagingButtonType.Image)
{
if(!isCurrent)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(index));
AddToolTip(writer,index);
writer.RenderBeginTag(HtmlTextWriterTag.A);
CreateNumericImages(writer,index,isCurrent);
writer.RenderEndTag();
}
else
CreateNumericImages(writer,index,isCurrent);
}
else
{
if(isCurrent)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight,"Bold");
writer.AddStyleAttribute(HtmlTextWriterStyle.Color,"red");
writer.RenderBeginTag(HtmlTextWriterTag.Font);
if(NumericButtonTextFormatString.Length>0)
writer.Write(String.Format(NumericButtonTextFormatString,(ChinesePageIndex==true)?GetChinesePageIndex(index):(index.ToString())));
else
writer.Write((ChinesePageIndex==true)?GetChinesePageIndex(index):index.ToString());
writer.RenderEndTag();
}
else
{
WriteCssClass(writer);
AddToolTip(writer,index);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(index));
writer.RenderBeginTag(HtmlTextWriterTag.A);
if(NumericButtonTextFormatString.Length>0)
writer.Write(String.Format(NumericButtonTextFormatString,(ChinesePageIndex==true)?GetChinesePageIndex(index):(index.ToString())));
else
writer.Write((ChinesePageIndex==true)?GetChinesePageIndex(index):index.ToString());
writer.RenderEndTag();
}
}
WriteButtonSpace(writer);
}
/// <summary>
/// 在分頁(yè)導(dǎo)航元素間加入空格。
/// </summary>
/// <param name="writer"></param>
private void WriteButtonSpace(HtmlTextWriter writer)
{
if(PagingButtonSpacing.Value>0)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,PagingButtonSpacing.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.RenderEndTag();
}
}
/// <summary>
/// 獲取中文頁(yè)索引字符。
/// </summary>
/// <param name="index">中文字符對(duì)應(yīng)的頁(yè)索引數(shù)值</param>
/// <returns>對(duì)應(yīng)于頁(yè)索引數(shù)值的中文字符</returns>
private string GetChinesePageIndex(int index)
{
Hashtable cnChars=new Hashtable();
cnChars.Add("0","O");
cnChars.Add("1","一");
cnChars.Add("2","二");
cnChars.Add("3","三");
cnChars.Add("4","四");
cnChars.Add("5","五");
cnChars.Add("6","六");
cnChars.Add("7","七");
cnChars.Add("8","八");
cnChars.Add("9","九");
string indexStr=index.ToString();
string retStr="";
for(int i=0;i<indexStr.Length;i++)
{
retStr=String.Concat(retStr,cnChars[indexStr[i].ToString()]);
}
return retStr;
}
/// <summary>
/// 創(chuàng)建頁(yè)索引圖片按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="index">頁(yè)索引數(shù)值。</param>
/// <param name="isCurrent">是否是當(dāng)前頁(yè)索引。</param>
private void CreateNumericImages(HtmlTextWriter writer,int index,bool isCurrent)
{
string indexStr=index.ToString();
for(int i=0;i<indexStr.Length;i++)
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,indexStr[i],(isCurrent==true)?CpiButtonImageNameExtension:ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
/// <summary>
/// 創(chuàng)建“更多頁(yè)”(...)按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="pageIndex">鏈接到按鈕的頁(yè)的索引。</param>
private void CreateMoreButton(HtmlTextWriter writer,int pageIndex)
{
WriteCssClass(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
if(PagingButtonType==PagingButtonType.Image&&MoreButtonType==PagingButtonType.Image)
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,"more",ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
else
writer.Write("...");
writer.RenderEndTag();
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,PagingButtonSpacing.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.RenderEndTag();
}
#endregion
#region IPostBackEventHandler Implementation
/// <summary>
/// 實(shí)現(xiàn)<see cref="IPostBackEventHandler"/> 接口,使 <see cref="AspNetPager"/> 控件能夠處理將窗體發(fā)送到服務(wù)器時(shí)引發(fā)的事件。
/// </summary>
/// <param name="args"></param>
public void RaisePostBackEvent(string args)
{
int pageIndex=CurrentPageIndex;
try
{
if(args==null||args=="")
args=inputPageIndex;
pageIndex=int.Parse(args);
}
catch{}
OnPageChanged(new PageChangedEventArgs(pageIndex));
}
#endregion
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應(yīng)用程序中對(duì)數(shù)據(jù)進(jìn)行分頁(yè)的的服務(wù)器控件。
/// </summary>
/// <remarks>不同于DataGrid控件,AspNetPager分頁(yè)控件本身并不顯示任何數(shù)據(jù),而只顯示頁(yè)導(dǎo)航元素,數(shù)據(jù)在頁(yè)面上的顯示方式與該控件無(wú)關(guān)。該控件可以為DataGrid、DataList、Repeater以及自定義控件進(jìn)行分頁(yè),配合Sql存儲(chǔ)過程,分頁(yè)性能較使用DataGrid分頁(yè)有明顯提升,尤其是當(dāng)數(shù)據(jù)量大時(shí)性能可提升數(shù)倍!
/// <p>AspNetPager 2.0 中新增了通過Url來分頁(yè)的功能,這使得訪問者可以直接輸入相應(yīng)的Url來訪問任何頁(yè)面,并且搜索引擎也可以直接檢索每個(gè)頁(yè)面,若使用DataGrid的分頁(yè)功能,這是無(wú)法實(shí)現(xiàn)的。</p>
/// <p>要使用 AspNetPager 分頁(yè)控件,必須最少指定它的 <see cref="RecordCount"/> 屬性,指定并編寫 <see cref="PageChanged"/> 事件的處理程序。
/// <see cref="RecordCount"/> 屬性指定要分頁(yè)的所有數(shù)據(jù)的總項(xiàng)數(shù),若未指定該值或該值小于等于 <see cref="PageSize"/> ,則AspNetPager控件不會(huì)顯示任何內(nèi)容。
/// 若未指定并編寫 <see cref="PageChanged"/> 事件處理程序,則當(dāng)用戶點(diǎn)擊頁(yè)導(dǎo)航元素或在頁(yè)索引文本框中手式輸入頁(yè)索引并提交時(shí)AspNetPager不會(huì)跳轉(zhuǎn)到指定的頁(yè)。
/// AspNetPager控件的分頁(yè)方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件處理程序中將傳遞事件數(shù)據(jù)的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/>值賦給 AspNetPager的 <see cref="CurrentPageIndex"/>屬性,然后重新將新的數(shù)據(jù)與數(shù)據(jù)顯示控件綁定。 </p></remarks>
/// <example>以下示例說明如何用AspNetPager對(duì)DataGrid進(jìn)行分頁(yè)。
/// <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="記錄總數(shù):<font color=\"blue\"><b>"+pager.RecordCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 總頁(yè)數(shù):<font color=\"blue\"><b>"+pager.PageCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 當(dāng)前頁(yè):<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="轉(zhuǎn)到"
/// NumericButtonTextFormatString="[{0}]"/>
///
/// </form>
/// </body>
///</HTML>
/// ]]>
/// </code>
/// <p>下面是該示例所用的Sql Server存儲(chǔ)過程:</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應(yīng)用程序的分頁(yè)控件")]
[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>
/// 獲取或設(shè)置一個(gè)值,該值批示當(dāng)鼠標(biāo)指針懸停在導(dǎo)航按鈕上時(shí)是否顯示工具提示。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(true),
Description("指定當(dāng)鼠標(biāo)停留在導(dǎo)航按鈕上時(shí),是否顯示工具提示")]
public bool ShowNavigationToolTip
{
get
{
object obj=ViewState["ShowNavigationToolTip"];
return (obj==null)?true:(bool)obj;
}
set
{
ViewState["ShowNavigationToolTip"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置導(dǎo)航按鈕工具提示文本的格式。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue("轉(zhuǎn)到第{0}頁(yè)"),
Description("頁(yè)導(dǎo)航按鈕工具提示文本的格式")]
public string NavigationToolTipTextFormatString
{
get
{
object obj=ViewState["NavigationToolTipTextFormatString"];
return (obj==null)?"轉(zhuǎn)到第{0}頁(yè)":(string)obj;
}
set
{
string tip=value;
if(tip.Trim().Length<1&&tip.IndexOf("{0}")<0)
tip="{0}";
ViewState["NavigationToolTipTextFormatString"]=tip;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否將頁(yè)索引按鈕用中文數(shù)字代替。
/// </summary>
/// <remarks>
/// 將該值設(shè)為true并且未使用圖片按鈕時(shí),頁(yè)索引按鈕中的數(shù)值1、2、3等將會(huì)被中文字符一、二、三等代替。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(false),
Description("是否將頁(yè)索引數(shù)值按鈕用中文數(shù)字一、二、三等代替")]
public bool ChinesePageIndex
{
get
{
object obj=ViewState["ChinesePageIndex"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["ChinesePageIndex"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引數(shù)值導(dǎo)航按鈕上文字的顯示格式。
/// </summary>
/// <value>
/// 字符串,指定頁(yè)索引數(shù)值按鈕上文字的顯示格式,默認(rèn)值為<see cref="String.Empty"/>,即未設(shè)置該屬性。</value>
/// <remarks>
/// 使用NumericButtonTextFormatString屬性指定頁(yè)索引數(shù)值按鈕的顯示格式,如未設(shè)置該值時(shí)索引按鈕文本將會(huì)是:1 2 3 ...,設(shè)置該值將改變索引按鈕文本的顯示格式,
/// 如將該值設(shè)為“[{0}]”則索引文本會(huì)顯示為:[1] [2] [3] ...,將該值設(shè)為“-{0}-”則會(huì)使索引文本變?yōu)椋?1- -2- -3- ...。
/// </remarks>
[Browsable(true),
DefaultValue(""),
Category("導(dǎo)航按鈕"),
Description("頁(yè)索引數(shù)值按鈕上文字的顯示格式")]
public string NumericButtonTextFormatString
{
get
{
object obj=ViewState["NumericButtonTextFormatString"];
return (obj==null)?String.Empty:(string)obj;
}
set
{
ViewState["NumericButtonTextFormatString"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置分頁(yè)導(dǎo)航按鈕的類型,即使用文字還是圖片。
/// </summary>
/// <remarks>
/// 要使用圖片按鈕,您需要準(zhǔn)備以下圖片:從0到9的十個(gè)數(shù)值圖片(當(dāng)ShowPageIndex設(shè)為true時(shí)),第一頁(yè)、上一頁(yè)、下一頁(yè)、最后一頁(yè)及更多頁(yè)(...)五個(gè)按鈕圖片(當(dāng)ShowFirstLast及ShowPrevNext都設(shè)為true時(shí)),
/// 若需要使當(dāng)前頁(yè)索引的數(shù)值按鈕不同于別的頁(yè)索引數(shù)值按鈕,則還需準(zhǔn)備當(dāng)前頁(yè)索引的按鈕圖片;
/// 若需要使已禁用的第一頁(yè)、上一頁(yè)、下一頁(yè)及最后一頁(yè)按鈕圖片不同于正常的按鈕圖片,則還需準(zhǔn)備這四個(gè)按鈕在禁用狀態(tài)下的圖片;
/// <p><b>圖片文件的命名規(guī)則如下:</b></p>
/// <p>從0到9十張數(shù)值按鈕圖片必須命名為“數(shù)值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用設(shè)置,
/// ButtonImageExtension是圖片文件的后綴名,如 .gif或 .jpg等可以在瀏覽器中顯示的任何圖片文件類型。如頁(yè)索引“1”的圖片文件可命名為“1.gif”或“1.jpg”,
/// 當(dāng)您有兩套或更多套圖片文件時(shí),可以通過指定ButtonImageNameExtension屬性值來區(qū)分不同套的圖片,如第一套圖片可以不用設(shè)ButtonImageNameExtension,則圖片文件名類似于“1.gif”、“2.gif”等等,而第二套圖片則設(shè)置ButtonImageNameExtension為“f”,圖片文件名類似于“1f.gif”,“2f.gif”等等。</p>
/// <p>第一頁(yè)按鈕的圖片文件名以“first”開頭,上一頁(yè)按鈕圖片名以“prev”開頭,下一頁(yè)按鈕圖片名以“next”開頭,最后一頁(yè)按鈕圖片名以“l(fā)ast”開頭,更多頁(yè)按鈕圖片名以“more”開頭,是否使用ButtonImageNameExtension取決于數(shù)值按鈕的設(shè)置及是否有更多套圖片。</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("導(dǎo)航按鈕"),
Description("分頁(yè)導(dǎo)航按鈕的類型,是使用文字還是圖片")]
public PagingButtonType PagingButtonType
{
get
{
object obj=ViewState["PagingButtonType"];
return (obj==null)?PagingButtonType.Text:(PagingButtonType)obj;
}
set
{
ViewState["PagingButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)導(dǎo)航數(shù)值按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image當(dāng)又不想讓頁(yè)索引數(shù)值按鈕使用圖片時(shí),可以將該值設(shè)為Text,這會(huì)使頁(yè)索引數(shù)據(jù)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
DefaultValue(PagingButtonType.Text),
Category("導(dǎo)航按鈕"),
Description("頁(yè)導(dǎo)航數(shù)值按鈕的類型")]
public PagingButtonType NumericButtonType
{
get
{
object obj=ViewState["NumericButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NumericButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置第一頁(yè)、上一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image但又不想讓第一頁(yè)、下一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕使用圖片,則可以將該值設(shè)為Text,這會(huì)使前面的四個(gè)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("第一頁(yè)、上一頁(yè)、下一頁(yè)和最后一頁(yè)按鈕的類型")]
public PagingButtonType NavigationButtonType
{
get
{
object obj=ViewState["NavigationButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NavigationButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置“更多頁(yè)”(...)按鈕的類型,該值僅當(dāng)PagingButtonType設(shè)為Image時(shí)才有效。
/// </summary>
/// <remarks>
/// 當(dāng)您將PagingButtonType設(shè)為Image但又不想讓更多頁(yè)(...)按鈕使用圖片時(shí),可以將此值設(shè)為Text,這會(huì)使更多頁(yè)按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("“更多頁(yè)”(...)按鈕的類型")]
public PagingButtonType MoreButtonType
{
get
{
object obj=ViewState["MoreButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["MoreButtonType"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置分頁(yè)導(dǎo)航按鈕之間的間距。
/// </summary>
[Browsable(true),
Category("導(dǎo)航按鈕"),
DefaultValue(typeof(Unit),"5px"),
Description("分頁(yè)導(dǎo)航按鈕之間的間距")]
public Unit PagingButtonSpacing
{
get
{
object obj=ViewState["PagingButtonSpacing"];
return (obj==null)?Unit.Pixel(5):(Unit.Parse(obj.ToString()));
}
set
{
ViewState["PagingButtonSpacing"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示第一頁(yè)和最后一頁(yè)按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示第一頁(yè)和最后一頁(yè)按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowFirstLast
{
get
{
object obj=ViewState["ShowFirstLast"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowFirstLast"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示上一頁(yè)和下一頁(yè)按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示上一頁(yè)和下一頁(yè)按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowPrevNext
{
get
{
object obj=ViewState["ShowPrevNext"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPrevNext"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示是否在頁(yè)導(dǎo)航元素中顯示頁(yè)索引數(shù)值按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁(yè)導(dǎo)航元素中顯示數(shù)值按鈕"),
Category("導(dǎo)航按鈕"),
DefaultValue(true)]
public bool ShowPageIndex
{
get
{
object obj=ViewState["ShowPageIndex"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPageIndex"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為第一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("第一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">9</font>")]
public string FirstPageText
{
get
{
object obj=ViewState["FirstPageText"];
return (obj==null)?"<font face=\"webdings\">9</font>":(string)obj;
}
set{ViewState["FirstPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為上一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("上一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">3</font>")]
public string PrevPageText
{
get
{
object obj=ViewState["PrevPageText"];
return (obj==null)?"<font face=\"webdings\">3</font>":(string)obj;
}
set{ViewState["PrevPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為下一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("下一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">4</font>")]
public string NextPageText
{
get
{
object obj=ViewState["NextPageText"];
return (obj==null)?"<font face=\"webdings\">4</font>":(string)obj;
}
set{ViewState["NextPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置為最后一頁(yè)按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("最后一頁(yè)按鈕上顯示的文本"),
Category("導(dǎo)航按鈕"),
DefaultValue("<font face=\"webdings\">:</font>")]
public string LastPageText
{
get
{
object obj=ViewState["LastPageText"];
return (obj==null)?"<font face=\"webdings\">:</font>":(string)obj;
}
set{ViewState["LastPageText"]=value;}
}
/// <summary>
/// 獲取或設(shè)置在 <see cref="AspNetPager"/> 控件的頁(yè)導(dǎo)航元素中同時(shí)顯示的數(shù)值按鈕的數(shù)目。
/// </summary>
[Browsable(true),
Description("要顯示的頁(yè)索引數(shù)值按鈕的數(shù)目"),
Category("導(dǎo)航按鈕"),
DefaultValue(10)]
public int NumericButtonCount
{
get
{
object obj=ViewState["NumericButtonCount"];
return (obj==null)?10:(int)obj;
}
set{ViewState["NumericButtonCount"]=value;}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指定是否顯示已禁用的按鈕。
/// </summary>
/// <remarks>
/// 該值用來指定是否顯示已禁用的分頁(yè)導(dǎo)航按鈕,當(dāng)當(dāng)前頁(yè)為第一頁(yè)時(shí),第一頁(yè)和上一頁(yè)按鈕將被禁用,當(dāng)當(dāng)前頁(yè)為最后一頁(yè)時(shí),下一頁(yè)和最后一頁(yè)按鈕將被禁用,被禁用的按鈕沒有鏈接,在按鈕上點(diǎn)擊也不會(huì)有任何作用。
/// </remarks>
[Browsable(true),
Category("導(dǎo)航按鈕"),
Description("是否顯示已禁用的按鈕"),
DefaultValue(true)]
public bool ShowDisabledButtons
{
get
{
object obj=ViewState["ShowDisabledButtons"];
return (obj==null)?true:(bool)obj;
}
set
{
ViewState["ShowDisabledButtons"]=value;
}
}
#endregion
#region Image Buttons
/// <summary>
/// 獲取或設(shè)置當(dāng)使用圖片按鈕時(shí),圖片文件的路徑。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
Description("當(dāng)使用圖片按鈕時(shí),指定圖片文件的路徑"),
DefaultValue(null)]
public string ImagePath
{
get
{
string imgPath=(string)ViewState["ImagePath"];
if(imgPath!=null)
imgPath=this.ResolveUrl(imgPath);
return imgPath;
}
set
{
string imgPath=value.Trim().Replace("\\","/");
ViewState["ImagePath"]=(imgPath.EndsWith("/"))?imgPath:imgPath+"/";
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)使用圖片按鈕時(shí),圖片的類型,如gif或jpg,該值即圖片文件的后綴名。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
DefaultValue(".gif"),
Description("當(dāng)使用圖片按鈕時(shí),圖片的類型,如gif或jpg,該值即圖片文件的后綴名")]
public string ButtonImageExtension
{
get
{
object obj=ViewState["ButtonImageExtension"];
return (obj==null)?".gif":(string)obj;
}
set
{
string ext=value.Trim();
ViewState["ButtonImageExtension"]=(ext.StartsWith("."))?ext:("."+ext);
}
}
/// <summary>
/// 獲取或設(shè)置自定義圖片文件名的后綴字符串,以區(qū)分不同類型的按鈕圖片。
/// </summary>
/// <remarks><note>注意:</note>該值不是文件后綴名,而是為區(qū)分不同的圖片文件而在圖片名中加入的字符串,如:
/// 當(dāng)前有兩套按鈕圖片,其中一套中的“1”的圖片名可為“1f.gif”,另一套中的“1”的圖片名可起為“1n.gif”,其中的f和n即為ButtonImageNameExtension。</remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("自定義圖片文件名的后綴字符串(非文件后綴名),如圖片“1f.gif”的ButtonImageNameExtension即為“f”")]
public string ButtonImageNameExtension
{
get
{
return (string)ViewState["ButtonImageNameExtension"];
}
set
{
ViewState["ButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)前頁(yè)索引按鈕的圖片名后綴。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="PagingButtonType"/> 設(shè)為 Image 時(shí),該屬性允許您設(shè)置當(dāng)前頁(yè)索引數(shù)值按鈕使用的圖片名后綴字符,因此可以使當(dāng)前頁(yè)索引按鈕與其它頁(yè)索引按鈕使用不同的圖片,若未設(shè)置該值,則默認(rèn)值為<see cref="ButtonImageNameExtension"/>,即當(dāng)前頁(yè)索引按鈕與其它頁(yè)索引按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("當(dāng)前頁(yè)索引按鈕的圖片名后綴字符串")]
public string CpiButtonImageNameExtension
{
get
{
object obj=ViewState["CpiButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["CpiButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置已禁用的頁(yè)導(dǎo)航按鈕圖片名后綴字符串。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="PagingButtonType"/> 設(shè)為 Image 時(shí), 該值允許您設(shè)置已禁用(即沒有鏈接,因而點(diǎn)擊后無(wú)反應(yīng))的頁(yè)導(dǎo)航按鈕(包括第一頁(yè)、上一頁(yè)、下一頁(yè)、最后一頁(yè)四個(gè)按鈕)的圖片文件名后綴字符串,因此可以使已禁用的頁(yè)導(dǎo)航按鈕不同于正常的頁(yè)導(dǎo)航按鈕。若未設(shè)置該值,則默認(rèn)值為<see cref="ButtonImageNameExtension"/>,即已禁用的頁(yè)導(dǎo)航按鈕與正常的頁(yè)導(dǎo)航按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("已禁用的頁(yè)導(dǎo)航按鈕的圖片名后綴字符串")]
public string DisabledButtonImageNameExtension
{
get
{
object obj=ViewState["DisabledButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["DisabledButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 指定當(dāng)使用圖片按鈕時(shí),圖片的對(duì)齊方式。
/// </summary>
[Browsable(true),
Description("指定當(dāng)使用圖片按鈕時(shí),圖片的對(duì)齊方式"),
DefaultValue(ImageAlign.Baseline),
Category("圖片按鈕")]
public ImageAlign ButtonImageAlign
{
get
{
object obj=ViewState["ButtonImageAlign"];
return (obj==null)?ImageAlign.Baseline:(ImageAlign)obj;
}
set{ViewState["ButtonImageAlign"]=value;}
}
#endregion
#region Paging
/// <summary>
/// 獲取或設(shè)置是否啟用url來傳遞分頁(yè)信息。
/// </summary>
/// <remarks>
/// 啟用Url分頁(yè)方式是將用戶欲訪問的頁(yè)索引通過Url來傳遞,由于該分頁(yè)方式不使用頁(yè)面向自身回發(fā)來傳遞數(shù)據(jù),
/// 所以每次分頁(yè)時(shí)所有的數(shù)據(jù)都恢復(fù)為初始值或需要重新獲取。使用Url分頁(yè)方式不支持動(dòng)態(tài)改變分頁(yè)控件的屬性值,
/// 因暫時(shí)無(wú)法將新的屬性值通過Url來傳遞給下一頁(yè)。
/// </remarks>
/// <example>以下示例說明如何用AspNetPager的Url分頁(yè)方式對(duì)DataGrid進(jìn)行分頁(yè)(使用Access數(shù)據(jù)庫(kù)):
/// <code><![CDATA[
///<%@Register TagPrefix="Webdiyer" Namespace="Wuqi.Webdiyer" Assembly="aspnetpager"%>
///<%@Import Namespace="System.Data.OleDb"%>
///<%@ Import Namespace="System.Data"%>
///<%@ Page Language="C#" debug=true%>
///<HTML>
/// <HEAD>
/// <TITLE>Welcome to Webdiyer.com </TITLE>
/// <script runat="server">
/// OleDbConnection conn;
/// OleDbCommand cmd;
/// void Page_Load(object src,EventArgs e){
/// conn=new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.MapPath("access/aspnetpager.mdb"));
/// if(!Page.IsPostBack){
/// cmd=new OleDbCommand("select count(newsid) from wqnews",conn);
/// conn.Open();
/// pager.RecordCount=(int)cmd.ExecuteScalar();
/// conn.Close();
/// BindData();
/// }
/// }
///
/// void BindData(){
/// cmd=new OleDbCommand("select newsid,heading,source,addtime from wqnews order by addtime desc",conn);
/// OleDbDataAdapter adapter=new OleDbDataAdapter(cmd);
/// DataSet ds=new DataSet();
/// adapter.Fill(ds,pager.PageSize*(pager.CurrentPageIndex-1),pager.PageSize,"news");
/// dg.DataSource=ds.Tables["news"];
/// dg.DataBind();
/// }
///
/// 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">
/// <h2 align="center">AspNetPager分頁(yè)示例</h2>
/// <asp:DataGrid id="dg" runat="server"
/// Width="760" CellPadding="4" Align="center" />
///
/// <Webdiyer:AspNetPager runat="server" id="pager"
/// OnPageChanged="ChangePage"
/// HorizontalAlign="center"
/// style="MARGIN-TOP:10px;FONT-SIZE:16px"
/// PageSize="8"
/// ShowInputBox="always"
/// SubmitButtonStyle="border:1px solid #000066;height:20px;width:30px"
/// InputBoxStyle="border:1px #0000FF solid;text-align:center"
/// SubmitButtonText="轉(zhuǎn)到"
/// UrlPaging="true"
/// UrlPageIndexName="pageindex" />
/// </form>
/// </body>
///</HTML>
/// ]]></code>
/// </example>
[Browsable(true),
Category("分頁(yè)"),
DefaultValue(false),
Description("是否使用url傳遞分頁(yè)信息的方式來分頁(yè)")]
public bool UrlPaging
{
get
{
return urlPaging;
}
set
{
urlPaging=value;
}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)啟用Url分頁(yè)方式時(shí),在url中表示要傳遞的頁(yè)索引的參數(shù)的名稱。
/// </summary>
/// <remarks>
/// 該屬性允許您自定義通過Url傳遞頁(yè)索引時(shí)表示要傳遞的頁(yè)索引的參數(shù)的名稱,以避免與現(xiàn)有的參數(shù)名重復(fù)。
/// <p>該屬性的默認(rèn)值是“page”,即通過Url分頁(yè)時(shí),顯示在瀏覽器地址欄中的Url類似于:</p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2
/// <p>如將該值改為“pageindex”,則上面的Url將變?yōu)椋?lt;/p><p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2 </p>
/// </remarks>
[Browsable(true),
DefaultValue("page"),
Category("分頁(yè)"),
Description("當(dāng)啟用Url分頁(yè)方式時(shí),顯示在url中表示要傳遞的頁(yè)索引的參數(shù)的名稱")]
public string UrlPageIndexName
{
get{return urlPageIndexName;}
set{urlPageIndexName=value;}
}
/// <summary>
/// 獲取或設(shè)置當(dāng)前顯示頁(yè)的索引。
/// </summary>
///<remarks>使用此屬性來確定在 AspNetPager 控件中當(dāng)前顯示的頁(yè),當(dāng)前顯示的頁(yè)的數(shù)字索引將以紅色字體加粗顯示。此屬性還用于以編程的方式控制所顯示的頁(yè)。
///<p> <b>注意:</b>不同于DataGrid控件的CurrentPageIndex,AspNetPager的CurrentPageIndex屬性是從1開始的。</p></remarks>
[ReadOnly(true),
Browsable(false),
Description("當(dāng)前顯示頁(yè)的索引"),
Category("分頁(yè)"),
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
{
int cpage=value;
if(cpage<1)
cpage=1;
else if(cpage>this.PageCount)
cpage=this.PageCount;
ViewState["CurrentPageIndex"]=cpage;
}
}
/// <summary>
/// 獲取或設(shè)置需要分頁(yè)的所有記錄的總數(shù)。
/// </summary>
/// <remarks>
/// 當(dāng)頁(yè)面第一次加載時(shí),應(yīng)以編程方式將從存儲(chǔ)過程或Sql語(yǔ)句中返回的數(shù)據(jù)表中所有要分頁(yè)的記錄的總數(shù)賦予該屬性,AspNetPager會(huì)將其保存的ViewState中并在頁(yè)面回發(fā)時(shí)從ViewState中獲取該值,因此避免了每次分頁(yè)都要訪問數(shù)據(jù)庫(kù)而影響分頁(yè)性能。AspNetPager根據(jù)要分頁(yè)的所有數(shù)據(jù)的總項(xiàng)數(shù)和 <see cref="PageSize"/> 屬性來計(jì)算顯示所有數(shù)據(jù)需要的總頁(yè)數(shù),即 <see cref="PageCount"/>的值。
/// </remarks>
/// <example>
/// 下面的示例顯示如何以編程方式將從Sql語(yǔ)句返回的記錄總數(shù)賦給該屬性:
/// <p>
/// <code><![CDATA[
/// <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("select count(id) from news",conn);
/// conn.Open();
/// pager.RecordCount=(int)cmd.ExecuteScalar();
/// conn.Close();
/// BindData();
/// }
/// }
///
/// void BindData()
/// {
/// cmd=new SqlCommand("GetPagedNews",conn);
/// cmd.CommandType=CommandType.StoredProcedure;
/// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
/// cmd.Parameters.Add("@pagesize",pager.PageSize);
/// conn.Open();
/// dataGrid1.DataSource=cmd.ExecuteReader();
/// dataGrid1.DataBind();
/// conn.Close();
/// }
/// 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="before"
/// ShowInputBox="always"
/// CssClass="mypager"
/// HorizontalAlign="center"
/// OnPageChanged="ChangePage" />
///
/// </form>
/// </body>
///</HTML>
/// ]]>
/// </code></p>
/// <p>本示例使用的存儲(chǔ)過程代碼如下:</p>
/// <code><![CDATA[
///CREATE procedure GetPagedNews
/// (@pagesize int,
/// @pageindex int)
/// as
/// set nocount on
/// 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.title,O.source,O.addtime from news O,@indextable t where O.id=t.nid
/// and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
/// set nocount off
///GO
/// ]]>
/// </code>
/// </example>
[Browsable(false),
Description("要分頁(yè)的所有記錄的總數(shù),該值須在程序運(yùn)行時(shí)設(shè)置,默認(rèn)值為225是為設(shè)計(jì)時(shí)支持而設(shè)置的參照值。"),
Category("Data"),
DefaultValue(225)]
public int RecordCount
{
get
{
object obj=ViewState["Recordcount"];
return (obj==null)?0:(int)obj;
}
set{ViewState["Recordcount"]=value;}
}
/// <summary>
/// 獲取當(dāng)前頁(yè)之后未顯示的頁(yè)的總數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PagesRemain
{
get
{
return PageCount-CurrentPageIndex;
}
}
/// <summary>
/// 獲取或設(shè)置每頁(yè)顯示的項(xiàng)數(shù)。
/// </summary>
/// <remarks>
/// 該值獲取或設(shè)置數(shù)據(jù)呈現(xiàn)控件每次要顯示數(shù)據(jù)表中的的數(shù)據(jù)的項(xiàng)數(shù),AspNetPager根據(jù)該值和 <see cref="RecordCount"/> 來計(jì)算顯示所有數(shù)據(jù)需要的總頁(yè)數(shù),即 <see cref="PageCount"/>的值。</remarks>
/// <example>以下示例將 <see cref="AspNetPager"/> 設(shè)置為允許每頁(yè)顯示8條數(shù)據(jù):
/// <code>
/// <![CDATA[
/// ...
/// <Webdiyer:AspNetPager id="pager" runat="server" PageSize=8 OnPageChanged="ChangePage"/>
/// ...
/// ]]></code></example>
[Browsable(true),
Description("每頁(yè)顯示的記錄數(shù)"),
Category("分頁(yè)"),
DefaultValue(10)]
public int PageSize
{
get
{
object obj=ViewState["PageSize"];
return (obj==null)?10:(int)obj;
}
set
{
ViewState["PageSize"]=value;
}
}
/// <summary>
/// 獲取在當(dāng)前頁(yè)之后還未顯示的剩余記錄的項(xiàng)數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int RecordsRemain
{
get
{
if(CurrentPageIndex<PageCount)
return RecordCount-(CurrentPageIndex*PageSize);
return 0;}
}
/// <summary>
/// 獲取所有要分頁(yè)的記錄需要的總頁(yè)數(shù)。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PageCount
{
get{return (int)Math.Ceiling((double)RecordCount/(double)PageSize);}
}
#endregion
#region TextBox and Submit Button
/// <summary>
/// 獲取或設(shè)置頁(yè)索引文本框的顯示方式。
/// </summary>
/// <remarks>
/// 頁(yè)索引文件框允許用戶手式輸入要訪問的頁(yè)的索引,當(dāng)頁(yè)數(shù)非常多時(shí),顯示頁(yè)索引文本框非常方便用戶跳轉(zhuǎn)到指定的頁(yè),默認(rèn)情況下,該文本框只有在總頁(yè)數(shù)大于或等于 <see cref="ShowBoxThreshold"/> 的值時(shí)才顯示,否則不顯示,要想該文本框任何時(shí)候都顯示,請(qǐng)將其值設(shè)為Always,若希望任何時(shí)候都不顯示,則應(yīng)設(shè)為Never。
///</remarks>
[Browsable(true),
Description("指定頁(yè)索引文本框的顯示方式"),
Category("文本框及提交按鈕"),
DefaultValue(ShowInputBox.Auto)]
public ShowInputBox ShowInputBox
{
get
{
object obj=ViewState["ShowInputBox"];
return (obj==null)?ShowInputBox.Auto:(ShowInputBox)obj;
}
set{ViewState["ShowInputBox"]=value;}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于頁(yè)索引輸入文本框的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于頁(yè)索引輸入文本框的CSS類名")]
public string InputBoxClass
{
get
{
return (string)ViewState["InpubBoxClass"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引輸入文本框的CSS樣式文本。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于頁(yè)索引輸入文本框的CSS樣式文本")]
public string InputBoxStyle
{
get
{
return (string)ViewState["InputBoxStyle"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引頁(yè)索引輸入文本框前的文本字符串值。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("頁(yè)索引輸入文本框前的文本內(nèi)容字符串")]
public string TextBeforeInputBox
{
get
{
return (string)ViewState["TextBeforeInputBox"];
}
set
{
ViewState["TextBeforeInputBox"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置頁(yè)索引文本輸入框后的文本內(nèi)容字符串值。
/// </summary>
[Browsable(true),
DefaultValue(null),
Category("文本框及提交按鈕"),
Description("頁(yè)索引輸入文本框后的文本內(nèi)容字符串")]
public string TextAfterInputBox
{
get
{
return (string)ViewState["TextAfterInputBox"];
}
set
{
ViewState["TextAfterInputBox"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置提交按鈕上的文本。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue("go"),
Description("提交按鈕上的文本")]
public string SubmitButtonText
{
get
{
object obj=ViewState["SubmitButtonText"];
return (obj==null)?"go":(string)obj;
}
set
{
if(value.Trim().Length>0)
ViewState["SubmitButtonText"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于提交按鈕的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于提交按鈕的CSS類名")]
public string SubmitButtonClass
{
get
{
return (string)ViewState["SubmitButtonClass"];
}
set
{
ViewState["SubmitButtonClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于提交按鈕的CSS樣式。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應(yīng)用于提交按鈕的CSS樣式")]
public string SubmitButtonStyle
{
get
{
return (string)ViewState["SubmitButtonStyle"];
}
set
{
ViewState["SubmitButtonStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置自動(dòng)顯示頁(yè)索引輸入文本框的最低起始頁(yè)數(shù)。
/// </summary>
/// <remarks>
/// 當(dāng) <see cref="ShowInputBox"/> 設(shè)為Auto(默認(rèn))并且要分頁(yè)的數(shù)據(jù)的總頁(yè)數(shù)達(dá)到該值時(shí)會(huì)自動(dòng)顯示頁(yè)索引輸入文本框,默認(rèn)值為30。該選項(xiàng)當(dāng) <see cref="ShowInputBox"/> 設(shè)為Never或Always時(shí)沒有任何作用。
/// </remarks>
[Browsable(true),
Description("指定當(dāng)ShowInputBox設(shè)為ShowInputBox.Auto時(shí),當(dāng)總頁(yè)數(shù)達(dá)到多少時(shí)才顯示頁(yè)索引輸入文本框"),
Category("文本框及提交按鈕"),
DefaultValue(30)]
public int ShowBoxThreshold
{
get
{
object obj=ViewState["ShowBoxThreshold"];
return (obj==null)?30:(int)obj;
}
set{ViewState["ShowBoxThreshold"]=value;}
}
#endregion
#region CustomInfoSection
/// <summary>
/// 獲取或設(shè)置顯示用戶自定義信息區(qū)的方式。
/// </summary>
/// <remarks>
/// 該屬性值設(shè)為L(zhǎng)eft或Right時(shí)會(huì)在分頁(yè)導(dǎo)航元素左邊或右邊劃出一個(gè)專門的區(qū)域來顯示有關(guān)用戶自定義信息,設(shè)為Never時(shí)不顯示。
/// </remarks>
[Browsable(true),
Description("顯示當(dāng)前頁(yè)和總頁(yè)數(shù)信息,默認(rèn)值為不顯示,值為ShowCustomInfoSection.Left時(shí)將顯示在頁(yè)索引前,為ShowCustomInfoSection.Right時(shí)將顯示在頁(yè)索引后"),
DefaultValue(ShowCustomInfoSection.Never),
Category("自定義信息區(qū)")]
public ShowCustomInfoSection ShowCustomInfoSection
{
get
{
object obj=ViewState["ShowCustomInfoSection"];
return (obj==null)?ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;
}
set{ViewState["ShowCustomInfoSection"]=value;}
}
/// <summary>
/// 獲取或設(shè)置用戶自定義信息區(qū)文本的對(duì)齊方式。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(HorizontalAlign.Left),
Description("用戶自定義信息區(qū)文本的對(duì)齊方式")]
public HorizontalAlign CustomInfoTextAlign
{
get
{
object obj=ViewState["CustomInfoTextAlign"];
return (obj==null)?HorizontalAlign.Left:(HorizontalAlign)obj;
}
set
{
ViewState["CustomInfoTextAlign"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置用戶自定義信息區(qū)的寬度。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(typeof(Unit),"40%"),
Description("用戶自定義信息區(qū)的寬度")]
public Unit CustomInfoSectionWidth
{
get
{
object obj=ViewState["CustomInfoSectionWidth"];
return (obj==null)?Unit.Percentage(40):(Unit)obj;
}
set
{
ViewState["CustomInfoSectionWidth"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于用戶自定義信息區(qū)的級(jí)聯(lián)樣式表類名。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("應(yīng)用于用戶自定義信息區(qū)的級(jí)聯(lián)樣式表類名")]
public string CustomInfoClass
{
get
{
object obj=ViewState["CustomInfoClass"];
return (obj==null)?CssClass:(string)obj;
}
set
{
ViewState["CustomInfoClass"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本。
/// </summary>
/// <value>字符串值,要應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本。</value>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("應(yīng)用于用戶自定義信息區(qū)的CSS樣式文本")]
public string CustomInfoStyle
{
get
{
object obj=ViewState["CustomInfoStyle"];
return (obj==null)?GetStyleString():(string)obj;
}
set
{
ViewState["CustomInfoStyle"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置在顯示在用戶自定義信息區(qū)的用戶自定義文本。
/// </summary>
[Browsable(true),
Category("自定義信息區(qū)"),
DefaultValue(null),
Description("要顯示在用戶自定義信息區(qū)的用戶自定義信息文本")]
public string CustomInfoText
{
get
{
return (string)ViewState["CustomInfoText"];
}
set
{
ViewState["CustomInfoText"]=value;
}
}
#endregion
#region Others
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指定是否總是顯示AspNetPager分頁(yè)按件,即使要分頁(yè)的數(shù)據(jù)只有一頁(yè)。
/// </summary>
/// <remarks>
/// 默認(rèn)情況下,當(dāng)要分頁(yè)的數(shù)據(jù)小于兩頁(yè)時(shí),AspNetPager不會(huì)在頁(yè)面上顯示任何內(nèi)容,將此屬性值設(shè)為true時(shí),即使總頁(yè)數(shù)只有一頁(yè),AspNetPager也將顯示分頁(yè)導(dǎo)航元素。
/// </remarks>
[Browsable(true),
Category("Behavior"),
DefaultValue(false),
Description("總是顯示分頁(yè)控件,即使要分頁(yè)的數(shù)據(jù)只要一頁(yè)")]
public bool AlwaysShow
{
get
{
object obj=ViewState["AlwaysShow"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["AlwaysShow"]=value;
}
}
/// <summary>
/// 獲取或設(shè)置由 AspNetPager 服務(wù)器控件在客戶端呈現(xiàn)的級(jí)聯(lián)樣式表 (CSS) 類。
/// </summary>
[Browsable(true),
Description("應(yīng)用于控件的CSS類名"),
Category("Appearance"),
DefaultValue(null)]
public override string CssClass
{
get{return base.CssClass;}
set
{
base.CssClass=value;
cssClassName=value;
}
}
/// <summary>
/// 獲取或設(shè)置一個(gè)值,該值指示 AspNetPager 服務(wù)器控件是否向發(fā)出請(qǐng)求的客戶端保持自己的視圖狀態(tài),該屬性經(jīng)重寫后不允許設(shè)為false。
/// </summary>
/// <remarks><see cref="AspNetPager"/> 服務(wù)器控件將一些重要的分頁(yè)信息保存在ViewState中,當(dāng)使用Url分頁(yè)方式時(shí),雖然視圖狀態(tài)在分頁(yè)過程中沒有任何作用,但若當(dāng)前頁(yè)需要回發(fā),則必須啟用視圖狀態(tài)以便分頁(yè)控件能在頁(yè)面回發(fā)后獲取回發(fā)前的分頁(yè)狀態(tài);當(dāng)通過頁(yè)面回發(fā)(PostBack)的方式來分頁(yè)時(shí),要使AspNetPager正常工作,必須啟用視圖狀態(tài)。
/// <p><note>該屬性并不能禁止用戶用<![CDATA[<%@Page EnableViewState=false%> ]]>頁(yè)指令來禁用整個(gè)頁(yè)面的視圖狀態(tài),當(dāng)使用此指令并且設(shè)置AspNetPager通過頁(yè)面回發(fā)來分頁(yè)時(shí),AspNetPager因?yàn)闊o(wú)法獲取保存的信息而不能正常工作。</note></p></remarks>
[Browsable(false),
Description("是否啟用控件的視圖狀態(tài),該屬性的值必須為true,不允許用戶設(shè)置。"),
DefaultValue(true),
Category("Behavior")]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState=true;
}
}
#endregion
#endregion
#region Control Rendering Logic
/// <summary>
/// 重寫 <see cref="System.Web.UI.Control.OnLoad"/> 方法。
/// </summary>
/// <param name="e">包含事件數(shù)據(jù)的 <see cref="EventArgs"/> 對(duì)象。</param>
protected override void OnLoad(EventArgs e)
{
if(urlPaging)
{
currentUrl=Page.Request.Path;
urlParams=Page.Request.QueryString;
string pageIndex=Page.Request.QueryString[urlPageIndexName];
int index=1;
try
{
index=int.Parse(pageIndex);
}
catch{}
OnPageChanged(new PageChangedEventArgs(index));
}
else
{
inputPageIndex=Page.Request.Form[this.UniqueID+"_input"];
}
base.OnLoad(e);
}
/// <summary>
/// 重寫<see cref="System.Web.UI.Control.OnPreRender"/>方法。
/// </summary>
/// <param name="e">包含事件數(shù)據(jù)的 <see cref="EventArgs"/> 對(duì)象。</param>
protected override void OnPreRender(EventArgs e)
{
if(PageCount>1)
{
string checkscript="<script language=\"Javascript\">function doCheck(el){var r=new RegExp(\"^\\\\s*(\\\\d+)\\\\s*$\");if(r.test(el.value)){if(RegExp.$1<1||RegExp.$1>"+PageCount.ToString()+"){alert(\"頁(yè)數(shù)必須介于1和"+PageCount.ToString()+"之間!\");document.all[\'"+this.UniqueID+"_input\'].select();return false;}return true;}alert(\"輸入的頁(yè)索引無(wú)效!\");document.all[\'"+this.UniqueID+"_input\'].select();return false;}</script>";
if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&&PageCount>=ShowBoxThreshold))
{
if(!Page.IsClientScriptBlockRegistered("checkinput"))
Page.RegisterClientScriptBlock("checkinput",checkscript);
string script="<script language=\"javascript\" > <!-- \nfunction BuildUrlString(key,value){ var loc=window.location.search.substring(1); var params=loc.split(\"&\"); if(params.length<=1||(params.length==2&¶ms[0].toLowerCase()==key)) return location.pathname+\"?\"+key+\"=\"+value; var newparam=\"\"; var flag=false; for(i=0;i<params.length;i++){ if(params[i].split(\"=\")[0].toLowerCase()==key.toLowerCase()){ params[i]=key+\"=\"+value; flag=true; break; } } for(i=0;i<params.length;i++){ newparam+=params[i]+\"&\"; } if(flag) newparam=newparam.substring(0,newparam.length-1); else newparam+=key+\"=\"+value; return location.pathname+\"?\"+newparam; } \n//--> </script>";
if(!Page.IsClientScriptBlockRegistered("BuildUrlScript"))
Page.RegisterClientScriptBlock("BuildUrlScript",script);
}
}
base.OnPreRender(e);
}
///<summary>
///重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderBeginTag"/> 方法,將 <see cref="AspNetPager"/> 控件的 HTML 開始標(biāo)記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
public override void RenderBeginTag(HtmlTextWriter writer)
{
bool showPager=(PageCount>1||(PageCount<=1&&AlwaysShow));
writer.WriteLine();
writer.Write("<!------------------------------ ");
writer.Write("AspNetPager V4.2 Start");
writer.WriteLine(" ------------------------------>");
writer.Write("<!-------------------- ");
writer.Write("Copyright:2003 Webdiyer(www.webdiyer.com)");
writer.Write(" ---------------------");
writer.WriteLine(">");
base.RenderBeginTag(writer);
if(!showPager)
{
writer.Write("<!-----因?yàn)榭傢?yè)數(shù)只有一頁(yè),并且AlwaysShow屬性設(shè)為false,AspNetPager沒有顯示任何內(nèi)容,若要在總頁(yè)數(shù)只有一頁(yè)的情況下顯示AspNetPager,請(qǐng)將AlwaysShow屬性設(shè)為true!");
writer.Write("----->");
}
if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&&showPager)
{
writer.AddAttribute(HtmlTextWriterAttribute.Width,"100%");
writer.AddAttribute(HtmlTextWriterAttribute.Style,GetStyleString());
if(Height!=Unit.Empty)
writer.AddStyleAttribute(HtmlTextWriterStyle.Height,Height.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Cellpadding,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Cellspacing,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Table);
writer.RenderBeginTag(HtmlTextWriterTag.Tr);
WriteCellAttributes(writer,true);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
}
}
///<summary>
///重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderEndTag"/> 方法,將 <see cref="AspNetPager"/> 控件的 HTML 結(jié)束標(biāo)記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
public override void RenderEndTag(HtmlTextWriter writer)
{
if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&&PageCount>1)
{
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
base.RenderEndTag(writer);
writer.WriteLine();
writer.Write("<!------------------------------- ");
writer.Write("AspNetPager V4.2 End");
writer.Write(" --------------------------------");
writer.WriteLine(">");
writer.WriteLine();
}
/// <summary>
/// 重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderContents"/> 方法,將控件的內(nèi)容呈現(xiàn)到指定 <see cref="System.Web.UI.HtmlTextWriter"/> 的編寫器中。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
protected override void RenderContents(HtmlTextWriter writer)
{
if(PageCount<=1&&!AlwaysShow)
return;
if(ShowCustomInfoSection==ShowCustomInfoSection.Left)
{
writer.Write(CustomInfoText);
writer.RenderEndTag();
WriteCellAttributes(writer,false);
writer.AddAttribute(HtmlTextWriterAttribute.Class,CssClass);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
}
int midpage=(int)((CurrentPageIndex-1)/NumericButtonCount);
int pageoffset=midpage*NumericButtonCount;
int endpage=((pageoffset+NumericButtonCount)>PageCount)?PageCount:(pageoffset+NumericButtonCount);
this.CreateNavigationButton(writer,"first");
this.CreateNavigationButton(writer,"prev");
if(ShowPageIndex)
{
if(CurrentPageIndex>NumericButtonCount)
CreateMoreButton(writer,pageoffset);
for(int i=pageoffset+1;i<=endpage;i++)
{
CreateNumericButton(writer,i);
}
if(PageCount>NumericButtonCount&&endpage<PageCount)
CreateMoreButton(writer,endpage+1);
}
this.CreateNavigationButton(writer,"next");
this.CreateNavigationButton(writer,"last");
if((ShowInputBox==ShowInputBox.Always)||(ShowInputBox==ShowInputBox.Auto&&PageCount>=ShowBoxThreshold))
{
writer.Write(" ");
if(TextBeforeInputBox!=null)
writer.Write(TextBeforeInputBox);
writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"30px");
writer.AddAttribute(HtmlTextWriterAttribute.Value,inputPageIndex);
if(InputBoxStyle!=null&&InputBoxStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,InputBoxStyle);
if(InputBoxClass!=null&&InputBoxClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,InputBoxClass);
if(PageCount<=1&&AlwaysShow)
writer.AddAttribute(HtmlTextWriterAttribute.ReadOnly,"true");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID+"_input");
string scriptRef="doCheck(document.all[\'"+this.UniqueID+"_input\'])";
string postRef="if(event.keyCode==13){if("+scriptRef+")__doPostBack(\'"+this.UniqueID+"\',document.all[\'"+this.UniqueID+"_input\'].value);else{event.returnValue=false;}}";
string keydownScript="if(event.keyCode==13){if("+scriptRef+"){event.returnValue=false;document.all[\'"+this.UniqueID+"\'][1].click();}else{event.returnValue=false;}}";
string clickScript="if("+scriptRef+"){location.href=BuildUrlString(\'"+urlPageIndexName+"\',document.all[\'"+this.UniqueID+"_input\'].value)}";
writer.AddAttribute("onkeydown",(urlPaging==true)?keydownScript:postRef);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();
if(TextAfterInputBox!=null)
writer.Write(TextAfterInputBox);
writer.AddAttribute(HtmlTextWriterAttribute.Type,(urlPaging==true)?"Button":"Submit");
writer.AddAttribute(HtmlTextWriterAttribute.Name,this.UniqueID);
writer.AddAttribute(HtmlTextWriterAttribute.Value,SubmitButtonText);
if(SubmitButtonClass!=null&&SubmitButtonClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,SubmitButtonClass);
if(SubmitButtonStyle!=null&&SubmitButtonStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,SubmitButtonStyle);
if(PageCount<=1&&AlwaysShow)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
writer.AddAttribute(HtmlTextWriterAttribute.Onclick,(urlPaging==true)?clickScript:"return "+scriptRef);
writer.RenderBeginTag(HtmlTextWriterTag.Input);
writer.RenderEndTag();}
if(ShowCustomInfoSection==ShowCustomInfoSection.Right)
{
writer.RenderEndTag();
WriteCellAttributes(writer,false);
writer.RenderBeginTag(HtmlTextWriterTag.Td);
writer.Write(CustomInfoText);
}
}
#endregion
#region Private Helper Functions
/// <summary>
/// 將基控件的Style轉(zhuǎn)換為CSS字符串。
/// </summary>
/// <returns></returns>
private string GetStyleString()
{
if(Style.Count>0)
{
string stl=null;
string[] skeys=new string[Style.Count];
Style.Keys.CopyTo(skeys,0);
for(int i=0;i<skeys.Length;i++)
{
stl+=String.Concat(skeys[i],":",Style[skeys[i]],";");
}
return stl;
}
return null;
}
/// <summary>
/// 為用戶自定義信息區(qū)和頁(yè)導(dǎo)航按鈕區(qū)和td添加屬性。
/// </summary>
/// <param name="writer"></param>
/// <param name="leftCell">是否為第一個(gè)td</param>
private void WriteCellAttributes(HtmlTextWriter writer,bool leftCell)
{
string customUnit=CustomInfoSectionWidth.ToString();
if(ShowCustomInfoSection==ShowCustomInfoSection.Left&&leftCell||ShowCustomInfoSection==ShowCustomInfoSection.Right&&!leftCell)
{
if(CustomInfoClass!=null&&CustomInfoClass.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,CustomInfoClass);
if(CustomInfoStyle!=null&&CustomInfoStyle.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Style,CustomInfoStyle);
writer.AddAttribute(HtmlTextWriterAttribute.Valign,"bottom");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,customUnit);
writer.AddAttribute(HtmlTextWriterAttribute.Align,CustomInfoTextAlign.ToString().ToLower());
}
else
{
if(CustomInfoSectionWidth.Type==UnitType.Percentage)
{
customUnit=(Unit.Percentage(100-CustomInfoSectionWidth.Value)).ToString();
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,customUnit);
}
writer.AddAttribute(HtmlTextWriterAttribute.Valign,"bottom");
writer.AddAttribute(HtmlTextWriterAttribute.Align,HorizontalAlign.ToString().ToLower());
}
writer.AddAttribute(HtmlTextWriterAttribute.Nowrap,"true");
}
/// <summary>
/// 獲取分頁(yè)導(dǎo)航按鈕的超鏈接字符串。
/// </summary>
/// <param name="pageIndex">該分頁(yè)按鈕相對(duì)應(yīng)的頁(yè)索引。</param>
/// <returns>分頁(yè)導(dǎo)航按鈕的超鏈接字符串。</returns>
private string GetHrefString(int pageIndex)
{
if(urlPaging)
{
NameValueCollection col=new NameValueCollection();
col.Add(urlPageIndexName,pageIndex.ToString());
return BuildUrlString(col);
}
return Page.GetPostBackClientHyperlink(this,pageIndex.ToString());
}
/// <summary>
/// 當(dāng)使用Url分頁(yè)方式時(shí),在當(dāng)前Url上加入分頁(yè)參數(shù),若該參數(shù)存在,則改變其值。
/// </summary>
/// <param name="col">要加入到新Url中的參數(shù)名和值的集合。</param>
/// <returns>分頁(yè)導(dǎo)航按鈕的超鏈接字符串,包括分頁(yè)參數(shù)。</returns>
private string BuildUrlString(NameValueCollection col)
{
int i;
string tempstr="";
if(urlParams==null||urlParams.Count<=0)
{
for(i=0;i<col.Count;i++)
{
tempstr+=String.Concat("&",col.Keys[i],"=",col[i]);
}
return String.Concat(currentUrl,"?",tempstr.Substring(1));
}
NameValueCollection newCol=new NameValueCollection(urlParams);
string[] newColKeys=newCol.AllKeys;
for(i=0;i<newColKeys.Length;i++)
{
newColKeys[i]=newColKeys[i].ToLower();
}
for(i=0;i<col.Count;i++)
{
if(Array.IndexOf(newColKeys,col.Keys[i].ToLower())<0)
newCol.Add(col.Keys[i],col[i]);
else
newCol[col.Keys[i]]=col[i];
}
System.Text.StringBuilder sb=new System.Text.StringBuilder();
for(i=0;i<newCol.Count;i++)
{
sb.Append("&");
sb.Append(newCol.Keys[i]);
sb.Append("=");
sb.Append(newCol[i]);
}
return String.Concat(currentUrl,"?",sb.ToString().Substring(1));
}
/// <summary>
/// 創(chuàng)建第一頁(yè)、上一頁(yè)、下一頁(yè)及最后一頁(yè)分頁(yè)按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="btnname">分頁(yè)按鈕名。</param>
private void CreateNavigationButton(HtmlTextWriter writer,string btnname)
{
if(!ShowFirstLast&&(btnname=="first"||btnname=="last"))
return;
if(!ShowPrevNext&&(btnname=="prev"||btnname=="next"))
return;
string linktext="";
bool disabled;
int pageIndex;
bool imgButton=(PagingButtonType==PagingButtonType.Image&&NavigationButtonType==PagingButtonType.Image);
if(btnname=="prev"||btnname=="first")
{
disabled=(CurrentPageIndex<=1);
if(!ShowDisabledButtons&&disabled)
return;
pageIndex=(btnname=="first")?1:(CurrentPageIndex-1);
if(imgButton)
{
if(!disabled)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
writer.RenderEndTag();
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,DisabledButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
else
{
linktext=(btnname=="prev")?PrevPageText:FirstPageText;
if(disabled)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
else
{
WriteCssClass(writer);
AddToolTip(writer,pageIndex);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
}
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(linktext);
writer.RenderEndTag();
}
}
else
{
disabled=(CurrentPageIndex>=PageCount);
if(!ShowDisabledButtons&&disabled)
return;
pageIndex=(btnname=="last")?PageCount:(CurrentPageIndex+1);
if(imgButton)
{
if(!disabled)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
writer.RenderEndTag();
}
else
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,btnname,DisabledButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
else
{
linktext=(btnname=="next")?NextPageText:LastPageText;
if(disabled)
writer.AddAttribute(HtmlTextWriterAttribute.Disabled,"true");
else
{
WriteCssClass(writer);
AddToolTip(writer,pageIndex);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
}
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(linktext);
writer.RenderEndTag();
}
}
WriteButtonSpace(writer);
}
/// <summary>
/// 寫入CSS類名。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
private void WriteCssClass(HtmlTextWriter writer)
{
if(cssClassName!=null&&cssClassName.Trim().Length>0)
writer.AddAttribute(HtmlTextWriterAttribute.Class,cssClassName);
}
/// <summary>
/// 加入導(dǎo)航按鈕提示文本。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="pageIndex">導(dǎo)航按鈕對(duì)應(yīng)的頁(yè)索引。</param>
private void AddToolTip(HtmlTextWriter writer,int pageIndex)
{
if(ShowNavigationToolTip)
{
writer.AddAttribute(HtmlTextWriterAttribute.Title,String.Format(NavigationToolTipTextFormatString,pageIndex));
}
}
/// <summary>
/// 創(chuàng)建分頁(yè)數(shù)值導(dǎo)航按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="index">要?jiǎng)?chuàng)建按鈕的頁(yè)索引的值。</param>
private void CreateNumericButton(HtmlTextWriter writer,int index)
{
bool isCurrent=(index==CurrentPageIndex);
if(PagingButtonType==PagingButtonType.Image&&NumericButtonType==PagingButtonType.Image)
{
if(!isCurrent)
{
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(index));
AddToolTip(writer,index);
writer.RenderBeginTag(HtmlTextWriterTag.A);
CreateNumericImages(writer,index,isCurrent);
writer.RenderEndTag();
}
else
CreateNumericImages(writer,index,isCurrent);
}
else
{
if(isCurrent)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.FontWeight,"Bold");
writer.AddStyleAttribute(HtmlTextWriterStyle.Color,"red");
writer.RenderBeginTag(HtmlTextWriterTag.Font);
if(NumericButtonTextFormatString.Length>0)
writer.Write(String.Format(NumericButtonTextFormatString,(ChinesePageIndex==true)?GetChinesePageIndex(index):(index.ToString())));
else
writer.Write((ChinesePageIndex==true)?GetChinesePageIndex(index):index.ToString());
writer.RenderEndTag();
}
else
{
WriteCssClass(writer);
AddToolTip(writer,index);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(index));
writer.RenderBeginTag(HtmlTextWriterTag.A);
if(NumericButtonTextFormatString.Length>0)
writer.Write(String.Format(NumericButtonTextFormatString,(ChinesePageIndex==true)?GetChinesePageIndex(index):(index.ToString())));
else
writer.Write((ChinesePageIndex==true)?GetChinesePageIndex(index):index.ToString());
writer.RenderEndTag();
}
}
WriteButtonSpace(writer);
}
/// <summary>
/// 在分頁(yè)導(dǎo)航元素間加入空格。
/// </summary>
/// <param name="writer"></param>
private void WriteButtonSpace(HtmlTextWriter writer)
{
if(PagingButtonSpacing.Value>0)
{
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,PagingButtonSpacing.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.RenderEndTag();
}
}
/// <summary>
/// 獲取中文頁(yè)索引字符。
/// </summary>
/// <param name="index">中文字符對(duì)應(yīng)的頁(yè)索引數(shù)值</param>
/// <returns>對(duì)應(yīng)于頁(yè)索引數(shù)值的中文字符</returns>
private string GetChinesePageIndex(int index)
{
Hashtable cnChars=new Hashtable();
cnChars.Add("0","O");
cnChars.Add("1","一");
cnChars.Add("2","二");
cnChars.Add("3","三");
cnChars.Add("4","四");
cnChars.Add("5","五");
cnChars.Add("6","六");
cnChars.Add("7","七");
cnChars.Add("8","八");
cnChars.Add("9","九");
string indexStr=index.ToString();
string retStr="";
for(int i=0;i<indexStr.Length;i++)
{
retStr=String.Concat(retStr,cnChars[indexStr[i].ToString()]);
}
return retStr;
}
/// <summary>
/// 創(chuàng)建頁(yè)索引圖片按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="index">頁(yè)索引數(shù)值。</param>
/// <param name="isCurrent">是否是當(dāng)前頁(yè)索引。</param>
private void CreateNumericImages(HtmlTextWriter writer,int index,bool isCurrent)
{
string indexStr=index.ToString();
for(int i=0;i<indexStr.Length;i++)
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,indexStr[i],(isCurrent==true)?CpiButtonImageNameExtension:ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
}
/// <summary>
/// 創(chuàng)建“更多頁(yè)”(...)按鈕。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現(xiàn) HTML 內(nèi)容的輸出流。</param>
/// <param name="pageIndex">鏈接到按鈕的頁(yè)的索引。</param>
private void CreateMoreButton(HtmlTextWriter writer,int pageIndex)
{
WriteCssClass(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href,GetHrefString(pageIndex));
AddToolTip(writer,pageIndex);
writer.RenderBeginTag(HtmlTextWriterTag.A);
if(PagingButtonType==PagingButtonType.Image&&MoreButtonType==PagingButtonType.Image)
{
writer.AddAttribute(HtmlTextWriterAttribute.Src,String.Concat(ImagePath,"more",ButtonImageNameExtension,ButtonImageExtension));
writer.AddAttribute(HtmlTextWriterAttribute.Border,"0");
writer.AddAttribute(HtmlTextWriterAttribute.Align,ButtonImageAlign.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Img);
writer.RenderEndTag();
}
else
writer.Write("...");
writer.RenderEndTag();
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,PagingButtonSpacing.ToString());
writer.RenderBeginTag(HtmlTextWriterTag.Span);
writer.RenderEndTag();
}
#endregion
#region IPostBackEventHandler Implementation
/// <summary>
/// 實(shí)現(xiàn)<see cref="IPostBackEventHandler"/> 接口,使 <see cref="AspNetPager"/> 控件能夠處理將窗體發(fā)送到服務(wù)器時(shí)引發(fā)的事件。
/// </summary>
/// <param name="args"></param>
public void RaisePostBackEvent(string args)
{
int pageIndex=CurrentPageIndex;
try
{
if(args==null||args=="")
args=inputPageIndex;
pageIndex=int.Parse(args);
}
catch{}
OnPageChanged(new PageChangedEventArgs(pageIndex));
}
#endregion
您可能感興趣的文章:
- ASPNETPAGER分頁(yè)控件的使用方法[圖文]
- Asp.Net中的三種分頁(yè)方式總結(jié)
- Asp.net GridView使用大全(分頁(yè)實(shí)現(xiàn))
- ASP.NET 高性能分頁(yè)代碼
- ASP.NET MVC 5使用X.PagedList.Mvc進(jìn)行分頁(yè)教程(PagedList.Mvc)
- Asp.Net數(shù)據(jù)控件引用AspNetPager.dll分頁(yè)實(shí)現(xiàn)代碼
- asp.net Datalist控件實(shí)現(xiàn)分頁(yè)功能
- asp.net分頁(yè)控件AspNetPager的樣式美化
- asp.net 文章內(nèi)容分頁(yè)顯示的代碼
- 基于Dapper實(shí)現(xiàn)分頁(yè)效果 支持篩選、排序、結(jié)果集總數(shù)等
相關(guān)文章
gridview checkbox從服務(wù)器端和客戶端兩個(gè)方面實(shí)現(xiàn)全選和反選
GridView中的checkbox的全選和反選在很多的地方都是要求實(shí)現(xiàn)的,所以下面就從服務(wù)器端和客戶端兩個(gè)方面實(shí)現(xiàn)了checkbox的選擇,感興趣的朋友可以了解下,希望本文對(duì)你有所幫助2013-01-01ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)的請(qǐng)求次數(shù)
這篇文章介紹了ASP.NET MVC限制同一個(gè)IP地址單位時(shí)間間隔內(nèi)請(qǐng)求次數(shù)的方法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-10-10支持ASP.NET MVC、WebFroM的表單驗(yàn)證框架ValidationSuar使用介紹
這篇文章主要介紹了支持ASP.NET MVC、WebFroM的表單驗(yàn)證框架ValidationSuar使用介紹,本文詳細(xì)講解了使用步驟,并給出一個(gè)完整Demo下載,需要的朋友可以參考下2015-06-06asp.net 文件上傳與刷新與asp.net頁(yè)面與iframe之間的數(shù)據(jù)傳輸
眾所周知微軟所提供的updatepanel不能支持文件上傳的異步刷新,但是往往當(dāng)你在項(xiàng)目中的其他頁(yè)面實(shí)現(xiàn)了異步刷新之后,客戶就會(huì)問你為什么有文件上傳的頁(yè)面就不能實(shí)現(xiàn)異步刷新呢?這時(shí)我們可能說一堆理由,但是最后大部分還是會(huì)妥協(xié)于客戶。2009-12-12.net 讀取項(xiàng)目AssemblyInfo.cs屬性值
.net 讀取項(xiàng)目AssemblyInfo.cs屬性值的實(shí)現(xiàn)代碼。2009-06-06.NET的Ajax請(qǐng)求數(shù)據(jù)提交實(shí)例
這篇文章主要介紹了.NET的Ajax請(qǐng)求數(shù)據(jù)提交實(shí)例,較為詳細(xì)的分析了Ajax請(qǐng)求、數(shù)據(jù)的提交以及參數(shù)的傳遞技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01