亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

AspNetPager分頁控件--使用方法

2019-11-18 16:35:17
字體:
來源:轉載
供稿:網友

//此源代碼僅供學習參考,不得用作任何商業用途;
//若需修改并重新編譯該控件,請保留完整的源代碼的版權信息!
//有關控件升級及新控件發布信息,請留意 www.webdiyer.com
using System;
using System.IO;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Collections.Specialized;
using System.Text;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
namespace Wuqi.Webdiyer
{
#region aspNetPager Server Control

#region 控件說明及示例
/// <summary>
/// 用于asp.net Web應用程序中對數據進行分頁的的服務器控件。
/// </summary>
/// <remarks>不同于DataGrid控件,AspNetPager分頁控件本身并不顯示任何數據,而只顯示頁導航元素,數據在頁面上的顯示方式與該控件無關。該控件可以為DataGrid、DataList、Repeater以及自定義控件進行分頁,配合Sql存儲過程,分頁性能較使用DataGrid分頁有明顯提升,尤其是當數據量大時性能可提升數倍!
/// <p>AspNetPager 2.0 中新增了通過Url來分頁的功能,這使得訪問者可以直接輸入相應的Url來訪問任何頁面,并且搜索引擎也可以直接檢索每個頁面,若使用DataGrid的分頁功能,這是無法實現的。</p>
/// <p>要使用 AspNetPager 分頁控件,必須最少指定它的 <see cref="RecordCount"/> 屬性,指定并編寫 <see cref="PageChanged"/> 事件的處理程序。
/// <see cref="RecordCount"/> 屬性指定要分頁的所有數據的總項數,若未指定該值或該值小于等于 <see cref="PageSize"/> ,則AspNetPager控件不會顯示任何內容。
/// 若未指定并編寫 <see cref="PageChanged"/> 事件處理程序,則當用戶點擊頁導航元素或在頁索引文本框中手式輸入頁索引并提交時AspNetPager不會跳轉到指定的頁。
/// AspNetPager控件的分頁方法和DataGrid基本相同,即在它的 <see cref="PageChanged"/> 事件處理程序中將傳遞事件數據的 <see cref="PageChangedEventArgs"/> 的 <see cref="PageChangedEventArgs.NewPageIndex"/>值賦給 AspNetPager的 <see cref="CurrentPageIndex"/>屬性,然后重新將新的數據與數據顯示控件綁定。 </p></remarks>
/// <example>以下示例說明如何用AspNetPager對DataGrid進行分頁。
/// <code><![CDATA[
///<%@ Page Language="C#"%>
///<%@ Import Namespace="System.Data"%>
///<%@Import Namespace="System.Data.SqlClient"%>
///<%@Import Namespace="System.Configuration"%>
///<%@Register Tag///<HTML>
///<HEAD>
///<TITLE>Welcome to Webdiyer.com </TITLE>
/// <scr
ipt runat="server">
/// SqlConnection conn;
/// SqlCommand cmd;
/// void Page_Load(object src,EventArgs e)
/// {
/// conn=new SqlConnection(ConfigurationSettings.AppSettings["ConnStr"]);
/// if(!Page.IsPostBack)
/// {
/// cmd=new SqlCommand("GetNews",conn);
/// cmd.CommandType=CommandType.StoredProcedure;
/// cmd.Parameters.Add("@pageindex",1);
/// cmd.Parameters.Add("@pagesize",1);
/// cmd.Parameters.Add("@docount",true);
/// conn.Open();
/// pager.RecordCount=(int)cmd.ExecuteScalar();
/// conn.Close();
/// BindData();
/// }
/// }
///
/// void BindData()
/// {
/// cmd=new SqlCommand("GetNews",conn);
/// cmd.CommandType=CommandType.StoredProcedure;
/// cmd.Parameters.Add("@pageindex",pager.CurrentPageIndex);
/// cmd.Parameters.Add("@pagesize",pager.PageSize);
/// cmd.Parameters.Add("@docount",false);
/// conn.Open();
/// dataGrid1.DataSource=cmd.ExecuteReader();
/// dataGrid1.DataBind();
/// conn.Close();
/// pager.CustomInfoText="記錄總數:<font color="blue"><b>"+pager.RecordCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 總頁數:<font color="blue"><b>"+pager.PageCount.ToString()+"</b></font>";
/// pager.CustomInfoText+=" 當前頁:<font color="red"><b>"+pager.CurrentPageIndex.ToString()+"</b></font>";
/// }
/// void ChangePage(object src,PageChangedEventArgs e)
/// {
/// pager.CurrentPageIndex=e.NewPageIndex;
/// BindData();
/// }
/// </script>
/// <meta http-equiv="Content-Language" content="zh-cn">
/// <meta http-equiv="content-type" content="text/html;charset=gb2312">
/// <META NAME="Generator" CONTENT="EditPlus">
/// <META NAME="Author" CONTENT="Webdiyer(yhaili@21cn.com)">
/// </HEAD>
/// <body>
/// <form runat="server" ID="Form1">
/// <asp:DataGrid id="dataGrid1" runat="server" />
/// <Webdiyer:AspNetPager id="pager"
/// runat="server"
/// PageSize="8"
/// NumericButtonCount="8"
/// ShowCustomInfoSection="left"
/// PagingButtonSpacing="0"
/// ShowInputBox="always"
/// CSSClass="mypager"
/// HorizontalAlign="right"
/// OnPageChanged="ChangePage"
/// SubmitButtonText="轉到"
/// NumericButtonTextFormatString="[{0}]"/>
/// </form>
/// </body>
///</HTML>
/// ]]>
/// </code>
/// <p>下面是該示例所用的Sql Server存儲過程:</p>
/// <code>
/// <![CDATA[
///CREATE procedure GetNews
/// (@pagesize int,
/// @pageindex int,
/// @docount bit)
/// as
/// set nocount on
/// if(@docount=1)
/// select count(id) from news
/// else
/// begin
/// declare @indextable table(id int identity(1,1),nid int)
/// declare @PageLowerBound int
/// declare @PageUpperBound int
/// set @PageLowerBound=(@pageindex-1)*@pagesize
/// set @PageUpperBound=@PageLowerBound+@pagesize
/// set rowcount @PageUpperBound
/// insert into @indextable(nid) select id from news order by addtime desc
/// select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
/// and t.id>@PageLowerBound and t.id < = @PageUpperBound order by t.id
/// end
/// set nocount off
///GO
/// ]]>
/// </code></example>
#endregion
[DefaultProperty("PageSize")]
[DefaultEvent("PageChanged")]
[ParseChildren(false)]
[PersistChildren(false)]
[Description("專用于ASP.Net Web應用程序的分頁控件")]
[Designer(typeof(PagerDesigner))]
[ToolboxData("<{0}:AspNetPager runat=server></{0}:AspNetPager>")]
public class AspNetPager:Panel,INamingContainer,IPostBackEventHandler,IPostBackDataHandler
{
private string cssClassName;
private string urlPageIndexName="page";
private bool urlPaging=false;
private string inputPageIndex;
private string currentUrl=null;
private NameValueCollection urlParams=null; #region Properties #region Navigation Buttons /// <summary>
/// 獲取或設置一個值,該值批示當鼠標指針懸停在導航按鈕上時是否顯示工具提示。
/// </summary>
[Browsable(true),
Category("導航按鈕"), DefaultValue(true), Description("指定當鼠標停留在導航按鈕上時,是否顯示工具提示")]
public bool ShowNavigationToolTip
{
get
{
object obj=ViewState["ShowNavigationToolTip"];
return (obj==null)?true:(bool)obj;
}
set
{
ViewState["ShowNavigationToolTip"]=value;
}
} /// <summary>
/// 獲取或設置導航按鈕工具提示文本的格式。
/// </summary>
[Browsable(true),
Category("導航按鈕"),
DefaultValue("轉到第{0}頁"),
Description("頁導航按鈕工具提示文本的格式")]
public string NavigationToolTipTextFormatString
{
get
{
object obj=ViewState["NavigationToolTipTextFormatString"];
return (obj==null)?"轉到第{0}頁":(string)obj;
}
set
{
string tip=value;
if(tip.Trim().Length<1&&tip.IndexOf("{0}")<0)
tip="{0}";
ViewState["NavigationToolTipTextFormatString"]=tip;
}
} /// <summary>
/// 獲取或設置一個值,該值指示是否將頁索引按鈕用中文數字代替。
/// </summary>
/// <remarks>
/// 將該值設為true并且未使用圖片按鈕時,頁索引按鈕中的數值1、2、3等將會被中文字符一、二、三等代替。
/// </remarks>
[Browsable(true),
Category("導航按鈕"),
DefaultValue(false),
Description("是否將頁索引數值按鈕用中文數字一、二、三等代替")]
public bool ChinesePageIndex
{
get
{
object obj=ViewState["ChinesePageIndex"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["ChinesePageIndex"]=value;
}
} /// <summary>
/// 獲取或設置頁索引數值導航按鈕上文字的顯示格式。
/// </summary>
/// <value>
/// 字符串,指定頁索引數值按鈕上文字的顯示格式,默認值為<see cref="String.Empty"/>,即未設置該屬性。</value>
/// <remarks>
/// 使用NumericButtonTextFormatString屬性指定頁索引數值按鈕的顯示格式,如未設置該值時索引按鈕文本將會是:1 2 3 ...,設置該值將改變索引按鈕文本的顯示格式,
/// 如將該值設為“[{0}]”則索引文本會顯示為:[1] [2] [3] ...,將該值設為“-{0}-”則會使索引文本變為:-1- -2- -3- ...。
/// </remarks>
[Browsable(true),
DefaultValue(""),
Category("導航按鈕"),
Description("頁索引數值按鈕上文字的顯示格式")]
public string NumericButtonTextFormatString
{
get
{
object obj=ViewState["NumericButtonTextFormatString"];
return (obj==null)?String.Empty:(string)obj;
}
set
{
ViewState["NumericButtonTextFormatString"]=value;
}
} /// <summary>
/// 獲取或設置分頁導航按鈕的類型,即使用文字還是圖片。
/// </summary>
/// <remarks>
/// 要使用圖片按鈕,您需要準備以下圖片:從0到9的十個數值圖片(當ShowPageIndex設為true時),第一頁、上一頁、下一頁、最后一頁及更多頁(...)五個按鈕圖片(當ShowFirstLast及ShowPrevNext都設為true時),
/// 若需要使當前頁索引的數值按鈕不同于別的頁索引數值按鈕,則還需準備當前頁索引的按鈕圖片;
/// 若需要使已禁用的第一頁、上一頁、下一頁及最后一頁按鈕圖片不同于正常的按鈕圖片,則還需準備這四個按鈕在禁用狀態下的圖片;
/// <p><b>圖片文件的命名規則如下:</b></p>
/// <p>從0到9十張數值按鈕圖片必須命名為“數值+ButtonImageNameExtension+ButtonImageExtension”,其中的ButtonImageNameExtension可以不用設置,
/// ButtonImageExtension是圖片文件的后綴名,如 .gif或 .jpg等可以在瀏覽器中顯示的任何圖片文件類型。如頁索引“1”的圖片文件可命名為“1.gif”或“1.jpg”,
/// 當您有兩套或更多套圖片文件時,可以通過指定ButtonImageNameExtension屬性值來區分不同套的圖片,如第一套圖片可以不用設ButtonImageNameExtension,則圖片文件名類似于“1.gif”、“2.gif”等等,而第二套圖片則設置ButtonImageNameExtension為“f”,圖片文件名類似于“1f.gif”,“2f.gif”等等。</p>
/// <p>第一頁按鈕的圖片文件名以“first”開頭,上一頁按鈕圖片名以“prev”開頭,下一頁按鈕圖片名以“next”開頭,最后一頁按鈕圖片名以“last”開頭,更多頁按鈕圖片名以“more”開頭,是否使用ButtonImageNameExtension取決于數值按鈕的設置及是否有更多套圖片。</p>
/// </remarks>
/// <example>
/// 以下代碼片段示例如果使用圖片按鈕:
/// <p>
/// <code><![CDATA[
/// <Webdiyer:AspNetPager runat="server"
/// id="pager1"
/// OnPageChanged="ChangePage"
/// PagingButtonType="image"
/// ImagePath="images"
/// ButtonImageNameExtension="n"
/// DisabledButtonImageNameExtension="g"
/// ButtonImageExtension="gif"
/// CpiButtonImageNameExtension="r"
/// PagingButtonSpacing=5/>
/// ]]>
/// </code>
/// </p>
/// </example>
[Browsable(true),
DefaultValue(PagingButtonType.Text),
Category("導航按鈕"),
Description("分頁導航按鈕的類型,是使用文字還是圖片")]
public PagingButtonType PagingButtonType
{
get
{
object obj=ViewState["PagingButtonType"];
return (obj==null)?PagingButtonType.Text:(PagingButtonType)obj;
}
set
{
ViewState["PagingButtonType"]=value;
}
} /// <summary>
/// 獲取或設置頁導航數值按鈕的類型,該值僅當PagingButtonType設為Image時才有效。
/// </summary>
/// <remarks>
/// 當您將PagingButtonType設為Image當又不想讓頁索引數值按鈕使用圖片時,可以將該值設為Text,這會使頁索引數據按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
DefaultValue(PagingButtonType.Text),
Category("導航按鈕"),
Description("頁導航數值按鈕的類型")]
public PagingButtonType NumericButtonType
{
get
{
object obj=ViewState["NumericButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NumericButtonType"]=value;
}
} /// <summary>
/// 獲取或設置第一頁、上一頁、下一頁和最后一頁按鈕的類型,該值僅當PagingButtonType設為Image時才有效。
/// </summary>
/// <remarks>
/// 當您將PagingButtonType設為Image但又不想讓第一頁、下一頁、下一頁和最后一頁按鈕使用圖片,則可以將該值設為Text,這會使前面的四個按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("第一頁、上一頁、下一頁和最后一頁按鈕的類型")]
public PagingButtonType NavigationButtonType
{
get
{
object obj=ViewState["NavigationButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["NavigationButtonType"]=value;
}
} /// <summary>
/// 獲取或設置“更多頁”(...)按鈕的類型,該值僅當PagingButtonType設為Image時才有效。
/// </summary>
/// <remarks>
/// 當您將PagingButtonType設為Image但又不想讓更多頁(...)按鈕使用圖片時,可以將此值設為Text,這會使更多頁按鈕使用文本而不是圖片按鈕。
/// </remarks>
[Browsable(true),
Category("導航按鈕"),
DefaultValue(PagingButtonType.Text),
Description("“更多頁”(...)按鈕的類型")]
public PagingButtonType MoreButtonType
{
get
{
object obj=ViewState["MoreButtonType"];
return (obj==null)?PagingButtonType:(PagingButtonType)obj;
}
set
{
ViewState["MoreButtonType"]=value;
}
} /// <summary>
/// 獲取或設置分頁導航按鈕之間的間距。
/// </summary>
[Browsable(true),
Category("導航按鈕"),
DefaultValue(typeof(Unit),"5px"),
Description("分頁導航按鈕之間的間距")]
public Unit PagingButtonSpacing
{
get
{
object obj=ViewState["PagingButtonSpacing"];
return (obj==null)?Unit.Pixel(5):(Unit.Parse(obj.ToString()));
}
set
{
ViewState["PagingButtonSpacing"]=value;
}
} /// <summary>
/// 獲取或設置一個值,該值指示是否在頁導航元素中顯示第一頁和最后一頁按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁導航元素中顯示第一頁和最后一頁按鈕"),
Category("導航按鈕"),
DefaultValue(true)]
public bool ShowFirstLast
{
get
{
object obj=ViewState["ShowFirstLast"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowFirstLast"]=value;}
} /// <summary>
/// 獲取或設置一個值,該值指示是否在頁導航元素中顯示上一頁和下一頁按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁導航元素中顯示上一頁和下一頁按鈕"),
Category("導航按鈕"),
DefaultValue(true)]
public bool ShowPrevNext
{
get
{
object obj=ViewState["ShowPrevNext"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPrevNext"]=value;}
} /// <summary>
/// 獲取或設置一個值,該值指示是否在頁導航元素中顯示頁索引數值按鈕。
/// </summary>
[Browsable(true),
Description("是否在頁導航元素中顯示數值按鈕"),
Category("導航按鈕"),
DefaultValue(true)]
public bool ShowPageIndex
{
get
{
object obj=ViewState["ShowPageIndex"];
return (obj==null)?true:(bool)obj;
}
set{ViewState["ShowPageIndex"]=value;}
} /// <summary>
/// 獲取或設置為第一頁按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("第一頁按鈕上顯示的文本"),
Category("導航按鈕"),
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>
/// 獲取或設置為上一頁按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("上一頁按鈕上顯示的文本"),
Category("導航按鈕"),
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>
/// 獲取或設置為下一頁按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("下一頁按鈕上顯示的文本"),
Category("導航按鈕"),
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>
/// 獲取或設置為最后一頁按鈕顯示的文本。
/// </summary>
[Browsable(true),
Description("最后一頁按鈕上顯示的文本"),
Category("導航按鈕"),
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>
/// 獲取或設置在 <see cref="AspNetPager"/> 控件的頁導航元素中同時顯示的數值按鈕的數目。
/// </summary>
[Browsable(true),
Description("要顯示的頁索引數值按鈕的數目"),
Category("導航按鈕"),
DefaultValue(10)]
public int NumericButtonCount
{
get
{
object obj=ViewState["NumericButtonCount"];
return (obj==null)?10:(int)obj;
}
set{ViewState["NumericButtonCount"]=value;}
} /// <summary>
/// 獲取或設置一個值,該值指定是否顯示已禁用的按鈕。
/// </summary>
/// <remarks>
/// 該值用來指定是否顯示已禁用的分頁導航按鈕,當當前頁為第一頁時,第一頁和上一頁按鈕將被禁用,當當前頁為最后一頁時,下一頁和最后一頁按鈕將被禁用,被禁用的按鈕沒有鏈接,在按鈕上點擊也不會有任何作用。
/// </remarks>
[Browsable(true),
Category("導航按鈕"),
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>
/// 獲取或設置當使用圖片按鈕時,圖片文件的路徑。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
Description("當使用圖片按鈕時,指定圖片文件的路徑"),
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>
/// 獲取或設置當使用圖片按鈕時,圖片的類型,如gif或jpg,該值即圖片文件的后綴名。
/// </summary>
[Browsable(true),
Category("圖片按鈕"),
DefaultValue(".gif"),
Description("當使用圖片按鈕時,圖片的類型,如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>
/// 獲取或設置自定義圖片文件名的后綴字符串,以區分不同類型的按鈕圖片。
/// </summary>
/// <remarks><note>注意:</note>該值不是文件后綴名,而是為區分不同的圖片文件而在圖片名中加入的字符串,如:
/// 當前有兩套按鈕圖片,其中一套中的“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>
/// 獲取或設置當前頁索引按鈕的圖片名后綴。
/// </summary>
/// <remarks>
/// 當 <see cref="PagingButtonType"/> 設為 Image 時,該屬性允許您設置當前頁索引數值按鈕使用的圖片名后綴字符,因此可以使當前頁索引按鈕與其它頁索引按鈕使用不同的圖片,若未設置該值,則默認值為<see cref="ButtonImageNameExtension"/>,即當前頁索引按鈕與其它頁索引按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("當前頁索引按鈕的圖片名后綴字符串")]
public string CpiButtonImageNameExtension
{
get
{
object obj=ViewState["CpiButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["CpiButtonImageNameExtension"]=value;
}
}

/// <summary>
/// 獲取或設置已禁用的頁導航按鈕圖片名后綴字符串。
/// </summary>
/// <remarks>
/// 當 <see cref="PagingButtonType"/> 設為 Image 時, 該值允許您設置已禁用(即沒有鏈接,因而點擊后無反應)的頁導航按鈕(包括第一頁、上一頁、下一頁、最后一頁四個按鈕)的圖片文件名后綴字符串,因此可以使已禁用的頁導航按鈕不同于正常的頁導航按鈕。若未設置該值,則默認值為<see cref="ButtonImageNameExtension"/>,即已禁用的頁導航按鈕與正常的頁導航按鈕使用相同的圖片。
/// </remarks>
[Browsable(true),
DefaultValue(null),
Category("圖片按鈕"),
Description("已禁用的頁導航按鈕的圖片名后綴字符串")]
public string DisabledButtonImageNameExtension
{
get
{
object obj=ViewState["DisabledButtonImageNameExtension"];
return (obj==null)?ButtonImageNameExtension:(string)obj;
}
set
{
ViewState["DisabledButtonImageNameExtension"]=value;
}
}
/// <summary>
/// 指定當使用圖片按鈕時,圖片的對齊方式。
/// </summary>

[Browsable(true),
Description("指定當使用圖片按鈕時,圖片的對齊方式"),
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>
/// 獲取或設置是否啟用url來傳遞分頁信息。
/// </summary>
/// <remarks>
/// 啟用Url分頁方式是將用戶欲訪問的頁索引通過Url來傳遞,由于該分頁方式不使用頁面向自身回發來傳遞數據,
/// 所以每次分頁時所有的數據都恢復為初始值或需要重新獲取。使用Url分頁方式不支持動態改變分頁控件的屬性值,
/// 因暫時無法將新的屬性值通過Url來傳遞給下一頁。
/// </remarks>
/// <example>以下示例說明如何用AspNetPager的Url分頁方式對DataGrid進行分頁(使用access數據庫):
/// <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分頁示例</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="轉到"
/// UrlPaging="true"
/// UrlPageIndexName="pageindex" />
/// </form>
/// </body>
///</HTML>
/// ]]></code>
/// </example>
[Browsable(true),
Category("分頁"),
DefaultValue(false),
Description("是否使用url傳遞分頁信息的方式來分頁")]
public bool UrlPaging
{
get
{
return urlPaging;
}
set
{
urlPaging=value;
}
}

/// <summary>
/// 獲取或設置當啟用Url分頁方式時,在url中表示要傳遞的頁索引的參數的名稱。
/// </summary>
/// <remarks>
/// 該屬性允許您自定義通過Url傳遞頁索引時表示要傳遞的頁索引的參數的名稱,以避免與現有的參數名重復。
/// <p>該屬性的默認值是“page”,即通過Url分頁時,顯示在瀏覽器地址欄中的Url類似于:</p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?page=2
/// <p>如將該值改為“pageindex”,則上面的Url將變為:</p><p>http://www.webdiyer.com/aspnetpager/samples/datagrid_url.aspx?pageindex=2 </p>
/// </remarks>
[Browsable(true),
DefaultValue("page"),
Category("分頁"),
Description("當啟用Url分頁方式時,顯示在url中表示要傳遞的頁索引的參數的名稱")]
public string UrlPageIndexName
{
get{return urlPageIndexName;}
set{urlPageIndexName=value;}
}

/// <summary>
/// 獲取或設置當前顯示頁的索引。
/// </summary>
///<remarks>使用此屬性來確定在 AspNetPager 控件中當前顯示的頁,當前顯示的頁的數字索引將以紅色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>
/// 獲取或設置需要分頁的所有記錄的總數。
/// </summary>
/// <remarks>
/// 當頁面第一次加載時,應以編程方式將從存儲過程或Sql語句中返回的數據表中所有要分頁的記錄的總數賦予該屬性,AspNetPager會將其保存的ViewState中并在頁面回發時從ViewState中獲取該值,因此避免了每次分頁都要訪問數據庫而影響分頁性能。AspNetPager根據要分頁的所有數據的總項數和 <see cref="PageSize"/> 屬性來計算顯示所有數據需要的總頁數,即 <see cref="PageCount"/>的值。
/// </remarks>
/// <example>
/// 下面的示例顯示如何以編程方式將從Sql語句返回的記錄總數賦給該屬性:
/// <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>本示例使用的存儲過程代碼如下:</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("要分頁的所有記錄的總數,該值須在程序運行時設置,默認值為225是為設計時支持而設置的參照值。"),
Category("Data"),
DefaultValue(225)]
public int RecordCount
{
get
{
object obj=ViewState["Recordcount"];
return (obj==null)?0:(int)obj;
}
set{ViewState["Recordcount"]=value;}
}

/// <summary>
/// 獲取當前頁之后未顯示的頁的總數。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int PagesRemain
{
get
{
return PageCount-CurrentPageIndex;
}
}

/// <summary>
/// 獲取或設置每頁顯示的項數。
/// </summary>
/// <remarks>
/// 該值獲取或設置數據呈現控件每次要顯示數據表中的的數據的項數,AspNetPager根據該值和 <see cref="RecordCount"/> 來計算顯示所有數據需要的總頁數,即 <see cref="PageCount"/>的值。</remarks>
/// <example>以下示例將 <see cref="AspNetPager"/> 設置為允許每頁顯示8條數據:
/// <code>
/// <![CDATA[
/// ...
/// <Webdiyer:AspNetPager id="pager" runat="server" PageSize=8 OnPageChanged="ChangePage"/>
/// ...
/// ]]></code></example>
[Browsable(true),
Description("每頁顯示的記錄數"),
Category("分頁"),
DefaultValue(10)]
public int PageSize
{
get
{
object obj=ViewState["PageSize"];
return (obj==null)?10:(int)obj;
}
set
{
ViewState["PageSize"]=value;
}
}

/// <summary>
/// 獲取在當前頁之后還未顯示的剩余記錄的項數。
/// </summary>
[Browsable(false),
DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public int RecordsRemain
{
get
{
if(CurrentPageIndex<PageCount)
return RecordCount-(CurrentPageIndex*PageSize);
return 0;}
}


/// <summary>
/// 獲取所有要分頁的記錄需要的總頁數。
/// </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>
/// 獲取或設置頁索引文本框的顯示方式。
/// </summary>
/// <remarks>
/// 頁索引文件框允許用戶手式輸入要訪問的頁的索引,當頁數非常多時,顯示頁索引文本框非常方便用戶跳轉到指定的頁,默認情況下,該文本框只有在總頁數大于或等于 <see cref="ShowBoxThreshold"/> 的值時才顯示,否則不顯示,要想該文本框任何時候都顯示,請將其值設為Always,若希望任何時候都不顯示,則應設為Never。
///</remarks>
[Browsable(true),
Description("指定頁索引文本框的顯示方式"),
Category("文本框及提交按鈕"),
DefaultValue(ShowInputBox.Auto)]
public ShowInputBox ShowInputBox
{
get
{
object obj=ViewState["ShowInputBox"];
return (obj==null)?ShowInputBox.Auto:(ShowInputBox)obj;
}
set{ViewState["ShowInputBox"]=value;}
}

/// <summary>
/// 獲取或設置應用于頁索引輸入文本框的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應用于頁索引輸入文本框的CSS類名")]
public string InputBoxClass
{
get
{
return (string)ViewState["InputBoxClass"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxClass"]=value;
}
}

/// <summary>
/// 獲取或設置頁索引輸入文本框的CSS樣式文本。
/// </summary>

[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應用于頁索引輸入文本框的CSS樣式文本")]
public string InputBoxStyle
{
get
{
return (string)ViewState["InputBoxStyle"];
}
set
{
if(value.Trim().Length>0)
ViewState["InputBoxStyle"]=value;
}
}

/// <summary>
/// 獲取或設置頁索引頁索引輸入文本框前的文本字符串值。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("頁索引輸入文本框前的文本內容字符串")]
public string TextBeforeInputBox
{
get
{
return (string)ViewState["TextBeforeInputBox"];
}
set
{
ViewState["TextBeforeInputBox"]=value;
}
}

/// <summary>
/// 獲取或設置頁索引文本輸入框后的文本內容字符串值。
/// </summary>
[Browsable(true),
DefaultValue(null),
Category("文本框及提交按鈕"),
Description("頁索引輸入文本框后的文本內容字符串")]
public string TextAfterInputBox
{
get
{
return (string)ViewState["TextAfterInputBox"];
}
set
{
ViewState["TextAfterInputBox"]=value;
}
}


/// <summary>
/// 獲取或設置提交按鈕上的文本。
/// </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>
/// 獲取或設置應用于提交按鈕的CSS類名。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應用于提交按鈕的CSS類名")]
public string SubmitButtonClass
{
get
{
return (string)ViewState["SubmitButtonClass"];
}
set
{
ViewState["SubmitButtonClass"]=value;
}
}

/// <summary>
/// 獲取或設置應用于提交按鈕的CSS樣式。
/// </summary>
[Browsable(true),
Category("文本框及提交按鈕"),
DefaultValue(null),
Description("應用于提交按鈕的CSS樣式")]
public string SubmitButtonStyle
{
get
{
return (string)ViewState["SubmitButtonStyle"];
}
set
{
ViewState["SubmitButtonStyle"]=value;
}
}
/// <summary>
/// 獲取或設置自動顯示頁索引輸入文本框的最低起始頁數。
/// </summary>
/// <remarks>
/// 當 <see cref="ShowInputBox"/> 設為Auto(默認)并且要分頁的數據的總頁數達到該值時會自動顯示頁索引輸入文本框,默認值為30。該選項當 <see cref="ShowInputBox"/> 設為Never或Always時沒有任何作用。
/// </remarks>
[Browsable(true),
Description("指定當ShowInputBox設為ShowInputBox.Auto時,當總頁數達到多少時才顯示頁索引輸入文本框"),
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>
/// 獲取或設置顯示用戶自定義信息區的方式。
/// </summary>
/// <remarks>
/// 該屬性值設為Left或Right時會在分頁導航元素左邊或右邊劃出一個專門的區域來顯示有關用戶自定義信息,設為Never時不顯示。
/// </remarks>
[Browsable(true),
Description("顯示當前頁和總頁數信息,默認值為不顯示,值為ShowCustomInfoSection.Left時將顯示在頁索引前,為ShowCustomInfoSection.Right時將顯示在頁索引后"),
DefaultValue(ShowCustomInfoSection.Never),
Category("自定義信息區")]
public ShowCustomInfoSection ShowCustomInfoSection
{
get
{
object obj=ViewState["ShowCustomInfoSection"];
return (obj==null)?ShowCustomInfoSection.Never:(ShowCustomInfoSection)obj;
}
set{ViewState["ShowCustomInfoSection"]=value;}
}

/// <summary>
/// 獲取或設置用戶自定義信息區文本的對齊方式。
/// </summary>
[Browsable(true),
Category("自定義信息區"),
DefaultValue(HorizontalAlign.Left),
Description("用戶自定義信息區文本的對齊方式")]
public HorizontalAlign CustomInfoTextAlign
{
get
{
object obj=ViewState["CustomInfoTextAlign"];
return (obj==null)?HorizontalAlign.Left:(HorizontalAlign)obj;
}
set
{
ViewState["CustomInfoTextAlign"]=value;
}
}

/// <summary>
/// 獲取或設置用戶自定義信息區的寬度。
/// </summary>
[Browsable(true),
Category("自定義信息區"),
DefaultValue(typeof(Unit),"40%"),
Description("用戶自定義信息區的寬度")]
public Unit CustomInfoSectionWidth
{
get
{
object obj=ViewState["CustomInfoSectionWidth"];
return (obj==null)?Unit.Percentage(40):(Unit)obj;
}
set
{
ViewState["CustomInfoSectionWidth"]=value;
}
}

/// <summary>
/// 獲取或設置應用于用戶自定義信息區的級聯樣式表類名。
/// </summary>
[Browsable(true),
Category("自定義信息區"),
DefaultValue(null),
Description("應用于用戶自定義信息區的級聯樣式表類名")]
public string CustomInfoClass
{
get
{
object obj=ViewState["CustomInfoClass"];
return (obj==null)?CssClass:(string)obj;
}
set
{
ViewState["CustomInfoClass"]=value;
}
}

/// <summary>
/// 獲取或設置應用于用戶自定義信息區的CSS樣式文本。
/// </summary>
/// <value>字符串值,要應用于用戶自定義信息區的CSS樣式文本。</value>
[Browsable(true),
Category("自定義信息區"),
DefaultValue(null),
Description("應用于用戶自定義信息區的CSS樣式文本")]
public string CustomInfoStyle
{
get
{
object obj=ViewState["CustomInfoStyle"];
return (obj==null)?GetStyleString():(string)obj;
}
set
{
ViewState["CustomInfoStyle"]=value;
}
}

/// <summary>
/// 獲取或設置在顯示在用戶自定義信息區的用戶自定義文本。
/// </summary>
[Browsable(true),
Category("自定義信息區"),
DefaultValue(null),
Description("要顯示在用戶自定義信息區的用戶自定義信息文本")]
public string CustomInfoText
{
get
{
return (string)ViewState["CustomInfoText"];
}
set
{
ViewState["CustomInfoText"]=value;
}
}

#endregion

#region Others

/// <summary>
/// 獲取或設置一個值,該值指定是否總是顯示AspNetPager分頁按件,即使要分頁的數據只有一頁。
/// </summary>
/// <remarks>
/// 默認情況下,當要分頁的數據小于兩頁時,AspNetPager不會在頁面上顯示任何內容,將此屬性值設為true時,即使總頁數只有一頁,AspNetPager也將顯示分頁導航元素。
/// </remarks>
[Browsable(true),
Category("Behavior"),
DefaultValue(false),
Description("總是顯示分頁控件,即使要分頁的數據只要一頁")]
public bool AlwaysShow
{
get
{
object obj=ViewState["AlwaysShow"];
return (obj==null)?false:(bool)obj;
}
set
{
ViewState["AlwaysShow"]=value;
}
}


/// <summary>
/// 獲取或設置由 AspNetPager 服務器控件在客戶端呈現的級聯樣式表 (CSS) 類。
/// </summary>
[Browsable(true),
Description("應用于控件的CSS類名"),
Category("Appearance"),
DefaultValue(null)]
public override string CssClass
{
get{return base.CssClass;}
set
{
base.CssClass=value;
cssClassName=value;
}
}


/// <summary>
/// 獲取或設置一個值,該值指示 AspNetPager 服務器控件是否向發出請求的客戶端保持自己的視圖狀態,該屬性經重寫后不允許設為false。
/// </summary>
/// <remarks><see cref="AspNetPager"/> 服務器控件將一些重要的分頁信息保存在ViewState中,當使用Url分頁方式時,雖然視圖狀態在分頁過程中沒有任何作用,但若當前頁需要回發,則必須啟用視圖狀態以便分頁控件能在頁面回發后獲取回發前的分頁狀態;當通過頁面回發(PostBack)的方式來分頁時,要使AspNetPager正常工作,必須啟用視圖狀態。
/// <p><note>該屬性并不能禁止用戶用<![CDATA[<%@Page EnableViewState=false%> ]]>頁指令來禁用整個頁面的視圖狀態,當使用此指令并且設置AspNetPager通過頁面回發來分頁時,AspNetPager因為無法獲取保存的信息而不能正常工作。</note></p></remarks>
[Browsable(false),
Description("是否啟用控件的視圖狀態,該屬性的值必須為true,不允許用戶設置。"),
DefaultValue(true),
Category("Behavior")]
public override bool EnableViewState
{
get
{
return base.EnableViewState;
}
set
{
base.EnableViewState=true;
}
}

/// <summary>
/// 獲取或設置當用戶輸入的頁索引超出范圍(大于最大頁索引或小于最小頁索引)時在客戶端顯示的錯誤信息。
/// </summary>
[Browsable(true),
Description("當用戶輸入的頁索引超出范圍(大于最大頁索引或小于最小頁索引)時在客戶端顯示的錯誤信息。"),
DefaultValue("頁數超出范圍!"),
Category("Data")]
public string PageIndexOutOfRangeErrorString
{
get
{
object obj=ViewState["PageIndexOutOfRangeErrorString"];
return (obj==null)?"頁數超出范圍!":(string)obj;
}
set
{
ViewState["PageIndexOutOfRangeErrorString"]=value;
}
}

/// <summary>
/// 獲取或設置當用戶輸入無效的頁索引(負值或非數字)時在客戶端顯示的錯誤信息。
/// </summary>
[Browsable(true),
Description("當用戶輸入無效的頁索引(負值或非數字)時在客戶端顯示的錯誤信息。"),
DefaultValue("頁索引無效!"),
Category("Data")]
public string InvalidPageIndexErrorString
{
get
{
object obj=ViewState["InvalidPageIndexErrorString"];
return (obj==null)?"頁索引無效!":(string)obj;
}
set
{
ViewState["InvalidPageIndexErrorString"]=value;
}
}

 


#endregion

#endregion

#region Control Rendering Logic

/// <summary>
/// 重寫 <see cref="System.Web.UI.Control.OnLoad"/> 方法。
/// </summary>
/// <param name="e">包含事件數據的 <see cref="EventArgs"/> 對象。</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">包含事件數據的 <see cref="EventArgs"/> 對象。</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(""+PageIndexOutOfRangeErrorString+"");document.all['"+this.UniqueID+"_input'].select();return false;}return true;}alert(""+InvalidPageIndexErrorString+"");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 _key=key.toLowerCase(); var prms=location.search; if(prms.length==0) return location.pathname+"?"+_key+"="+value; var params=prms.substring(1).split("&"); var newparam=""; var found=false; for(i=0;i<params.length;i++){ if(params[i].split("=")[0].toLowerCase()==_key){ params[i]=_key+"="+value; found=true; break; } } if(found) return location.pathname+"?"+params.join("&"); else return location+"&"+_key+"="+value; }n//--> </script>";
if(!Page.IsClientScriptBlockRegistered("BuildUrlScript"))
Page.RegisterClientScriptBlock("BuildUrlScript",script);
}
}
base.OnPreRender(e);
}

/// <summary>
/// 重寫<see cref="System.Web.UI.WebControls.WebControl.AddAttributesToRender"/> 方法,將需要呈現的 HTML 屬性和樣式添加到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 中
/// </summary>
/// <param name="writer"></param>
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
if(this.Page!=null)
this.Page.VerifyRenderingInServerForm(this);
base.AddAttributesToRender(writer);
}

///<summary>
///重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderBeginTag"/> 方法,將 <see cref="AspNetPager"/> 控件的 HTML 開始標記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現 HTML 內容的輸出流。</param>
public override void RenderBeginTag(HtmlTextWriter writer)
{
bool showPager=(PageCount>1||(PageCount<=1&&AlwaysShow));
writer.WriteLine();
writer.Write("<!------------------------------ ");
writer.Write("AspNetPager V4.3 Start");
writer.WriteLine(" ------------------------------>");
writer.Write("<!-------------------- ");
writer.Write("Copyright:2003 Webdiyer(writer.WriteLine(">");
base.RenderBeginTag(writer);
if(!showPager)
{
writer.Write("<!-----因為總頁數只有一頁,并且AlwaysShow屬性設為false,AspNetPager不顯示任何內容,若要在總頁數只有一頁的情況下顯示AspNetPager,請將AlwaysShow屬性設為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 結束標記輸出到指定的 <see cref="System.Web.UI.HtmlTextWriter"/> 編寫器中。
///</summary>
///<param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現 HTML 內容的輸出流。</param>
public override void RenderEndTag(HtmlTextWriter writer)
{
if((ShowCustomInfoSection==ShowCustomInfoSection.Left||ShowCustomInfoSection==ShowCustomInfoSection.Right)&&(PageCount>1||(PageCount<=1&&AlwaysShow)))
{
writer.RenderEndTag();
writer.RenderEndTag();
writer.RenderEndTag();
}
base.RenderEndTag(writer);
writer.WriteLine();
writer.Write("<!------------------------------- ");
writer.Write("AspNetPager V4.3 End");
writer.Write(" --------------------------------");
writer.WriteLine(">");
writer.WriteLine();
}
/// <summary>
/// 重寫 <see cref="System.Web.UI.WebControls.WebControl.RenderContents"/> 方法,將控件的內容呈現到指定 <see cref="System.Web.UI.HtmlTextWriter"/> 的編寫器中。
/// </summary>
/// <param name="writer"><see cref="System.Web.UI.HtmlTextWriter"/>,表示要在客戶端呈現 HTML 內容的輸出流。</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("&nbsp;&nbsp;&nbsp;&nbsp;");
if(TextBeforeInputBox!=null)
writer.Write(TextBeforeInputBox);
writer.AddAttribute(HtmlTextWriterAttribute.Type,"text");
writer.AddStyleAttribute(HtmlTextWriterStyle.Width,"30px");
writer.AddAttribute(HtmlTextWriterAttribute.Value,CurrentPageIndex.ToString());
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+"){even


csover 發表于:2006.07.21 08:46 ::分類: ( asp.net ) ::閱讀:(464次) :: 評論 (0) :: 引用 (0)
2006 年 07 月 20日, 星期四
一個簡單的分頁控件
采用Datagrid的默任的分頁方式分頁,后來發現對于大的數據量速度很慢,NET進程占用系統資源也很大,后來寫了個分頁的存儲過程,每次取數據都只取當前頁的,分頁是分好了,但是發現翻頁就沒那么方便了,于是自己寫了個簡單的分頁控件,代碼如下(編譯以后直接形成dll就可以用)。
sample code:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace PageInfoControl
{
///<summary>
///WebCustomeControl1的摘要說明
///</summary>
[DefaultProperty('TotalRecord'),ToolboxData('<{0}:PageInfo runat=server></{0}:PageInfo>')]
public class PageInfo:System.Web.UI.WebControls.WebControl,IPostBackEventHandler
{
#region Construct method
///<summary>
///構造函數
///</summary>
public PageInfo():base(HtmlTextWriterTag.Div)
{
}
#endregion

#region Variables and Constants
public event EventHandler ChangePageClick;
private string _BarBackGroudColor='#F1F1F1';
private string _BarLinkColor='Navy';
private string _BarCurrentColor='#EEEEEE';
private int _TotalRecord=0;
private int _TotalPage=0;
private int _CurrentPageIndex=1;
private int _ItemSize=10;
#endregion

#region Properties

[Description('分頁條背景色'),Bindable(true),Category('Appearance'),DefaultValue('#F1F1F1')]
public string BarBackGroundColor
{
get{return _BarBackGroundColor;}
set{_BarBackGroundColor=value;}
}

[Description('分頁條帶鏈接數字顏色'),Bindable(true),Category('Appearance'),DefaultValue('Navy')]
public string BarLinkColor
{
get{return _BarLinkColor;}
set{_BarLinkColor=value;}
}[Description('分頁條當前頁數字顏色'),Bindable(true),Category('Appearance'),DefaultValue('#EEEEEE')]
public string BarCurrentColor
{
get{return _BarCurrentColor;}
set{_BarCurrentColor=value;}
} [Description('總記錄數'),Bindable(false),Category('Behavior'),DefaultValue(0)]
public int TotalRecord
{
get{return _TotalRecord;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if(!Char.IsNumber(c)
{
_TotalRecord=0;
break;
}
_TotalRecord=value;
}
} [Description('每頁顯示記錄數'),Bindable(true),Category('Behavior'),DefaultValue(0)]
public int PageSize
{
get{return _PageSize;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if(!Char.IsNumber(c))
{
_PageSize=0;
break;
}
}
_PageSize=value;
}
}[Description('總頁數'),Bindable(true),Category('Behavior'),DefaultValue(0)]
public int TotalPage
{
get{return _TotalPage;}
}[Description('數字規格'),Bindable(true),Category('Behavior'),DefaultValue(10)]
public int ItemSize
{
get{return _ItemSize;}
set
{
foreach(char c in System.Convert.ToString(value))
{
if(!Char.IsNumber(c))
{
_ItemSize=10;
break;
}
}
_ItemSize=value;
}
}[Description('當前頁值'),Bindable(true),Category('Behavior'),DefaultValue(1)]
public int CurrentPageIndex
{
get{return _CurrentPageIndex;}
set{_CurrentPageIndex=value;}
}
#endregion

//定義Div的樣式
protected override void AddAttributesToRender(HtmlTextWriter writer)
{
writer.AddStyleAttribute('White-space','nowrap');
writer.AddStyleAttribute('Padding-Top','2px');
writer.AddStyleAttribute('Padding-Bottom',2px');
writer.AddStyleAttribute('Width',width.ToString());
writer.AddStyleAttribute('Height',Height.ToString());
base.AddAttributesToRender(writer);
}
protected virtual void OnPageChangeClick(EventArgs e)
{
if(ChangePageClick!=null)
{
ChangePageClick(this,e);
}
} public void RaisePostBackEvent(string eventArgument)
{
int PageIndex=int.Parse(eventArgument);
this._CurrentPageIndex=PageIndex;
OnPageChangeClick(new EventArgs());
}
///<summary>
///將此控件呈現給指定的輸出參數
///</summary>
///<param name='output'>要寫出到的HTML編寫器</param>
protected override void RenderContents(HtmlTextWriter output)
{this._TotalPage=((this.TotalRecord/PageSize)*this.PageSize==this.TotalRecord)?(this.TotalRecord/this.PageSize):((this.TotalRecord/this.PageSize)+1);
int BeginRecord=(this.CurrentPageIndex-1)*this.PageSize+1;
int EndRecord=this.CurrentPageIndex*this.PageSize;
String PageInfo='[共<font color=#CC0000>'+this.TotalPage.ToString()+'</font>頁/當前第<font color=#CC0000>'+this.CurrentPageIndex.ToString()+'</font>頁 共<font color=#CC0000>'+TotalRecord.ToString()+'</font>條記錄,當前記錄數<font color=#CC0000>'+BegingRecord.ToString()+'</font>到<font color=#CC0000>'+EndRecord.ToString()+'</font>]';
string PageListStr='';
string PageIndexColor='#0000C0';
int SingleNumber=this.TotalPage-(TotalPage/ItemSize)*ItemSize; //得到分頁后的尾數(比如:總共58頁,按10頁規格顯示,則尾數為8)
int IntPageForMax=(this.CurrentPageIndex-1)/ItemSize;
int MinInt=(1+ItemSize*IntPageForMax);
int MaxInt=((IntPageForMax+1)*ItemSize)>TotalPage?TotalPage:((IntPageForMax+1)*ItemSize);
if(this.TotalRecord==0||this.TotalPage==0)
{
PageListStr='<font color='+PageIndexColor+'>0</font>';
PageListStr=PageListStr+'[共<font color=#CC0000>0</font>頁/當前第<font color=#CC0000>0</font>頁 共<font color=#CC0000>0</font>條記錄,當前記錄數<font color=#CC0000>0</font>到<font color=#CC0000>0</font>]';
output.Write(PageListStr);
}
else
{
if(this.TotalPage<=this.ItemSize)
{
for(int i=1;i<=TotalPage;i++)
{
PageIndexColor=CurrentPageIndex==i?'#CC0000':'#0000C0';
if(CurrentPageIndex==i)
PageListStr=PageListStr+'<a title='當前為第['+i+']頁' href='#' id=''+this.UniqueID+''><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
else
PageListStr=PageListStr+'<a title='點擊轉到第['+i+']頁' id=''+this.UniqueID+'' href=' javascript:'+Page.GetPostBackEventReference(this,i.ToString())+''><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
}
PageListStr=PageListStr==''?'<font color='+PageIndexColor+'>0</font>':PageListStr;
PageListStr=PageListStr+''+PageInfo;
output.Write(PageListStr);
}
else
{
for(int i=MinInt;i<=MaxInt;i++)
{
PageIndexColor=CurrentPageIndex==i?'#CC0000':'#0000C0';
if(CurrentPageIndex==i)
PageListStr=PageListStr+'<a title='當前為第['+i+']頁' href='#' id=''+this.UniqueID+''><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
else
PageListStr=PageListStr+'<a title='點擊轉到第['+i+']頁' id=''+this.UniqueID+'' href=' javascript:'+Page.GetPostBackEventReference(this,i.ToString())+''><font color='+PageIndexColor+'>'+i.ToString()+'</font></a>';
}
//當當前頁數小于ItemSize且總的頁數大于ItemSize時
if(CurrentPageIndex<=ItemSize && TotalPage>ItemSize)
{
PageListStr=PageListStr+'<a id=''+this.UniqueID+'' title='點擊轉到第['+System.Convert.ToString(ItemSize+1)+']頁' href=' javascript:'+Page.GetPostBackEventReference(this.System.Convert.ToString(ItemSize+1))+''>>></a>';
//當當前頁數大于ItemSize,且總的頁數減去當前頁數大于等于尾數值頁數時
if(this.CurrentPageIndex>ItemSize && (TotalPage-this.CurrentPageIndex)>=SingleNumber)
{
int MultiMinPageIndex=(IntPageForMax*ItemSize);
int MultimaxPageIndex=((IntPageForMax+1)*ItemSize)+1;
PageListStr='<a id=''+this.UniqueID+'' title='點擊轉到第['+MultiMinPageIndex+']頁' href=' javascrcipt:'+Page.GetPostBackEventReference(this.MultiMinPageIndex.ToString())+''><<</a>'+PageListStr.Trim()+'<a id=''+this.UniqueID+'' title='點擊轉到第['+MultiMaxPageIndex+']頁' href=' javascript:'+Page.GetPostBackEventReference(this.MultiMaxPageIndex.ToString())+''>>></a>';
}
//當當前頁數大于ItemSize,且總的頁數減去當前頁數大于等于尾數值頁數時
if(CurrentPageIndex>10 && (TotalPage-CurrentPageIndex)<SingleNumber)
{
int MultiMinPageIndex=(IntPageForMax * ItemSize);
PageListStr='<a id=''+this.UniqueID+'' title='點擊轉到第['+MultiMinPageIndex+']頁' href=' javascript:'+Page.GetPostBackEventReference(this,MultiMinPageIndex.ToString ())+''><<</a>'+PageListStr.Trim();
}
PageListStr=PageListStr==''?'<font color='+PageIndexColor+'>0</font>':PageListStr;
PageListStr=PageListStr+''+PageInfo;
Output.Write(PageListStr);
}
}
base.RenderContents(output);
}
}
}
控件中有幾個相關的屬性,在使用的時候,只需要指定:TotalRecord(總記錄數)、PageSize(每頁的數據記錄數)、CurrentPageIndex(當前頁面值)、ItemSize(分頁條顯示頁面值的規格)
控件中有個ChangePageClick事件,可以利用“控件ID.CurrentPageIndex”屬性來獲取當前頁面值。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品揄拍500视频| 一区二区三区在线播放欧美| 亚洲第一视频网站| 日韩精品在线观看网站| 国产精品狠色婷| 91性高湖久久久久久久久_久久99| 成人在线视频福利| 日韩美女免费视频| 国产亚洲一区精品| 97在线观看免费高清| 精品久久久久久亚洲国产300| 欲色天天网综合久久| 欧美怡红院视频一区二区三区| 亚洲精品电影在线观看| 国产精品久久久久久久7电影| yellow中文字幕久久| 韩日欧美一区二区| 成人激情综合网| 亚洲人成在线一二| 国内精品小视频| 国产免费久久av| 国产综合久久久久| 欧美在线视频在线播放完整版免费观看| 97精品国产97久久久久久| 国产成人精品日本亚洲| 亚洲日韩中文字幕| 中文字幕亚洲色图| 国内精品久久久久久影视8| 亚洲国产成人精品女人久久久| 欧美乱大交xxxxx| 国产精品第七影院| 日韩av免费观影| 亚洲色图15p| 日本中文字幕成人| 国产精品va在线播放| 欧美在线精品免播放器视频| 中文字幕日韩高清| 欧美国产日韩免费| 久久亚洲精品小早川怜子66| 成人黄色片网站| 欧美黑人视频一区| 黑人与娇小精品av专区| 亚洲国产欧美一区二区三区久久| 亚洲伊人久久大香线蕉av| 国产97人人超碰caoprom| 日韩欧美精品中文字幕| 在线观看久久久久久| 午夜免费久久久久| 国产精品露脸自拍| 日韩欧美精品免费在线| 国产精品久久久久77777| 国产精品成人免费视频| 国产中文字幕亚洲| 国产欧美精品va在线观看| 久久久久久尹人网香蕉| 国产91在线播放九色快色| 亚洲精品自在久久| 国产日韩中文字幕在线| 日韩中文在线中文网三级| 久久影院中文字幕| 国产一区二区黑人欧美xxxx| 国内揄拍国内精品少妇国语| 欧美激情久久久久久| 欧美寡妇偷汉性猛交| 久久久人成影片一区二区三区观看| 中文字幕少妇一区二区三区| 日韩成人av在线播放| 欧美天天综合色影久久精品| 中文字幕日韩有码| 欧美丰满老妇厨房牲生活| 日韩在线精品视频| 欧美亚洲另类在线| 久久久噜噜噜久久中文字免| 亚洲自拍小视频免费观看| 亚洲欧美日韩国产精品| 日韩中文字幕在线| 色噜噜狠狠色综合网图区| 国产精品视频999| 亚洲国产精品久久久久久| 久久99久久亚洲国产| 久久亚洲国产精品成人av秋霞| 国产精品影院在线观看| 欧美精品成人在线| 日韩高清电影免费观看完整| 国产精品入口免费视| 欧美成aaa人片在线观看蜜臀| 久久伊人精品一区二区三区| 国产精品美女呻吟| 欧美老女人bb| 8090成年在线看片午夜| 免费99精品国产自在在线| 欧美精品一区二区免费| 久久精品成人一区二区三区| 亚洲午夜精品久久久久久性色| 4p变态网欧美系列| 欧美电影免费观看网站| 国产噜噜噜噜噜久久久久久久久| 亚洲人成电影在线观看天堂色| 成人欧美一区二区三区黑人孕妇| 亚洲石原莉奈一区二区在线观看| 久久久久久亚洲| 久久av红桃一区二区小说| 亚洲热线99精品视频| 亚洲免费成人av电影| 久久99国产精品久久久久久久久| 92看片淫黄大片看国产片| 欧美色视频日本高清在线观看| 日韩av大片免费看| 精品国产一区二区三区久久| 日韩va亚洲va欧洲va国产| 国产亚洲欧美另类中文| 亚洲免费人成在线视频观看| 久久亚洲国产成人| 欧美视频免费在线观看| 成人精品视频99在线观看免费| 国产精品久久久久久久久久ktv| 95av在线视频| 国产视频在线观看一区二区| 欧美乱人伦中文字幕在线| 美女精品视频一区| 欧洲亚洲免费在线| 欧美专区日韩视频| 欧美黑人国产人伦爽爽爽| 国产精品美女视频网站| 久久久午夜视频| 91欧美视频网站| 成人午夜小视频| 亚洲第一天堂av| 日韩电影中文 亚洲精品乱码| 日韩在线视频网站| 97在线免费观看视频| 日韩电影中文字幕在线| 中文字幕精品久久| 日本三级久久久| 欧美大尺度电影在线观看| 成人免费淫片aa视频免费| 欧美性videos高清精品| 91精品在线影院| 国产精品丝袜一区二区三区| 国产精品久久久精品| 成人亚洲欧美一区二区三区| 欧美另类精品xxxx孕妇| 69av视频在线播放| 久久97久久97精品免视看| 欧美日韩一二三四五区| 91精品国产高清久久久久久91| 2020欧美日韩在线视频| 在线观看久久久久久| 久热精品在线视频| 青青在线视频一区二区三区| 久久久久久久久久久人体| 粗暴蹂躏中文一区二区三区| 一本久久综合亚洲鲁鲁| 欧美一级免费视频| 欧美有码在线观看| 国产视频久久久久| 中文一区二区视频| 国产精品九九九| 欧美性xxxx极品hd欧美风情| 日本久久91av| 最新亚洲国产精品| 日韩电影中文字幕av| 精品视频—区二区三区免费| 国产精品视频网站|