using System;
using System.IO;
using System.Drawing;
using System.Data;
using System.Data.SqlClient;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace Pager
{
?///
?/// coolPager 的摘要说明。
?///
?public enum SortType
?{
??ASC=0,Desc=1
?};
?public enum IsCount
?{
??noReturnRecordCount=0,returnRecordCount
?};
?[DefaultProperty("copyRight"),
??ToolboxData("")]
?public class coolPager : System.Web.UI.WebControls.WebControl,INamingContainer
?{?
??protected int recordCount=0;
??protected Control _controlToPaginate;
??protected PagedDataSource _dataSource;
??[Bindable(true),
???Category("Appearance"),
???DefaultValue("")]
??public string copyRight
??{
???get
???{
????return "版权所有:千山一鸟";
???}
??}
??//连接字符串
??[Description("数据源连接字符串"),DefaultValue("")]
??public string connectionString
??{
???get
???{
????object obj = ViewState["connectionString"];
????return (obj==null)?String.Empty:obj.ToString();
???}
???set
???{
????ViewState["connectionString"]=value;
???}
??}
??//显示分页的控件
??[Description("用于显示分页的控件"),DefaultValue("")]
??public string controlToPaginate
??{
???get
???{
????object obj=ViewState["controlToPaginate"];
????return (obj==null)?String.Empty:obj.ToString();
???}
???set
???{
????ViewState["controlToPaginate"]=value;
???}
??}
??//表名
??[Description("查询表名"),DefaultValue("")]
??public string tableName
??{
???get
???{
????Object obj=ViewState["tableName"];
????return (obj==null)?String.Empty:obj.ToString();
???}
???set
???{
????ViewState["tableName"]=value;
???}
??}
??//排序字段名
??[Description("排序字段"),DefaultValue("")]
??public string fieldName
??{
???get
???{
????Object obj=ViewState["fieldName"];
????return (obj==null)?String.Empty:obj.ToString();
???}
???set
???{
????ViewState["fieldName"]=value;
???}
??}
??//每页显示记录数
??[Description("每页记录数"),DefaultValue("")]
??public int pageSize
??{
???get
???{
????Object obj=ViewState["pageSize"];
????return (obj==null)?15:Convert.ToInt32(obj);
???}
???set
???{
????ViewState["pageSize"]=value;
???}
??}
??//页码
??[Description("当前页码"),DefaultValue("")]
??public int pageIndex
??{
???get
???{
????Object obj=ViewState["pageIndex"];
????return (obj==null)?1:Convert.ToInt32(obj);
???}
???set
???{
????ViewState["pageIndex"]=value;
???}
??}
??//是否返回记录总数
??[Description("是否返回记录总数"),DefaultValue("")]
??public IsCount isCount
??{
???get
???{
????return IsCount.returnRecordCount;
???}
??}
??//排序类型
??[Description("排序类型"),DefaultValue("")]
??public SortType sortType
??{
???get
???{
????Object obj=ViewState["sortType"];
????return (obj==null)?SortType.ASC:(SortType)obj;
???}
???set
???{
????ViewState["sortType"]=value;
???}
??}
??//Where子句
??[Description("where子句,不带where"),DefaultValue("")]
??public string Where
??{
???get
???{
????Object obj=ViewState["Where"];
????return (obj==null)?String.Empty:obj.ToString();
???}
???set
???{
????ViewState["Where"]=value;
???}
??}
??[Description("显示导航数字数"),DefaultValue("")]
??public int showPageNumber
??{
???get
???{
????Object obj=ViewState["showPageNumber"];
????return (obj==null)?10:Convert.ToInt32(obj);
???}
???set
???{
????ViewState["showPageNumber"]=value;
???}
??}
??[Description("开始页"),DefaultValue("")]
??public int pageStart
??{
???get
???{
????Object obj=ViewState["pageStart"];
????return (obj==null)?1:Convert.ToInt32(obj);
???}
???set
???{
????ViewState["pageStart"]=value;
???}
??}
??[Description("总页数,自动生成"),DefaultValue("")]
??public int pageCount
??{
???get
???{
????Object obj=ViewState["pageCount"];
????return (obj==null)?1:Convert.ToInt32(obj);
???}
???set
???{
????ViewState["pageCount"]=value;
???}
??}
??///
??/// 将此控件呈现给指定的输出参数。
??///
??/// 要写出到的 HTML 编写器
??protected override void Render(HtmlTextWriter output)
??{
???if(Page.EnableViewState==false)
????Page.EnableViewState=true;
???if(Site!=null && Site.DesignMode)
????if(!Page.IsPostBack)
????CreateChildControls();
???base.Render(output);
??}
??public override void DataBind()
??{
???base.DataBind();
???ChildControlsCreated = false;
???if (controlToPaginate == "")
????return;
???_controlToPaginate = Page.FindControl(controlToPaginate);
???if (_controlToPaginate == null)
????return;
???if (!(_controlToPaginate is BaseDataList || _controlToPaginate is ListControl))
????return;
???if (connectionString == "" || tableName == "")
????return;
???// Fetch data
???FetchData();
???// Bind data to the buddy control
???BaseDataList baseDataListControl = null;
???ListControl listControl = null;
???if (_controlToPaginate is BaseDataList)
???{
????baseDataListControl = (BaseDataList) _controlToPaginate;
????baseDataListControl.DataSource = _dataSource;
????baseDataListControl.DataBind();
????return;
???}
???if (_controlToPaginate is ListControl)
???{
????listControl = (ListControl) _controlToPaginate;
????listControl.Items.Clear();
????listControl.DataSource = _dataSource;
????listControl.DataBind();
????return;
???}
??}
??private void FetchData()
??{
???SqlConnection cn=new SqlConnection(connectionString);
???SqlCommand cm=new SqlCommand();
???cm.Connection=cn;
???cm.Connection.Open();
???cm.CommandText="GetRecordFromPage";
???cm.CommandType=CommandType.StoredProcedure;
???cm.Parameters.Add("@tblName",SqlDbType.NVarChar,255);
???cm.Parameters.Add("@fldName",SqlDbType.NVarChar,255);
???cm.Parameters.Add("@PageSize",SqlDbType.Int);
???cm.Parameters.Add("@PageIndex",SqlDbType.Int);
???cm.Parameters.Add("@isCount",SqlDbType.Bit);
???cm.Parameters.Add("@OrderType",SqlDbType.Bit);
???cm.Parameters.Add("@strWhere",SqlDbType.NVarChar,1000);
???cm.Parameters["@tblName"].Value=tableName;
???cm.Parameters["@fldName"].Value=fieldName;
???cm.Parameters["@PageSize"].Value=pageSize;
???cm.Parameters["@PageIndex"].Value=pageIndex;
???cm.Parameters["@isCount"].Value=0;
???cm.Parameters["@OrderType"].Value=sortType;
???cm.Parameters["@strWhere"].Value=Where;
???SqlDataAdapter adapter = new SqlDataAdapter(cm);
???DataTable dtb = new DataTable();
???adapter.Fill(dtb);
???cm.Parameters["@isCount"].Value=isCount;
???recordCount=(int)cm.ExecuteScalar();
???pageCount=(int)Math.Ceiling((double)recordCount/pageSize);
???cm.Connection.Close();
???cm.Dispose();
???cn.Dispose();
???adapter.Dispose();
???// Configures the paged data source component
???if (_dataSource == null)
????_dataSource = new PagedDataSource();
???_dataSource.AllowCustomPaging = true;
???_dataSource.AllowPaging = true;
???_dataSource.CurrentPageIndex = 0;
???if(pageIndex==pageCount)
???{
????_dataSource.PageSize = (recordCount-(pageIndex-1)*pageSize);
???}
???else
???{
????_dataSource.PageSize = pageSize;
???}
???if(pageIndex==pageCount)
???{
????_dataSource.VirtualCount = (recordCount-(pageIndex-1)*pageSize);
???}
???else
???{
????_dataSource.VirtualCount = pageSize;
???}
???_dataSource.DataSource = dtb.DefaultView;
??}
??protected override void CreateChildControls()
??{
???Controls.Clear();
???if(!Page.IsPostBack)
???{
????ClearChildViewState();
???}
???//***********************************************
???Table table=new Table();
???table.Width=Unit.Percentage(100);
???table.CellPadding=0;
???table.CellSpacing=3;
???table.BorderWidth=0;
???table.Font.Size=FontUnit.Point(9);
???TableRow tr=new TableRow();
???TableCell tdInfo=new TableCell();
???tdInfo.Width=Unit.Percentage(25);
???tdInfo.HorizontalAlign=HorizontalAlign.Left;
???BuildInfo(tdInfo);
???tr.Cells.Add(tdInfo);
???TableCell tdNavigate=new TableCell();
???tdNavigate.Width=Unit.Percentage(50);
???tdNavigate.HorizontalAlign=HorizontalAlign.Center;
???BuildNavigator(tdNavigate);
???tr.Cells.Add(tdNavigate);
???TableCell tdGOTO=new TableCell();
???tdGOTO.Width=Unit.Percentage(25);
???tdGOTO.HorizontalAlign=HorizontalAlign.Right;
???BuildGOTO(tdGOTO);
???tr.Cells.Add(tdGOTO);
???table.Rows.Add(tr);
???Controls.Add(table);
??}
??private void BuildInfo(TableCell td)
??{
???LiteralControl lc=new LiteralControl();
???lc.Text="页码:"+pageIndex.ToString()+"|"+pageCount.ToString()+" 记录:"+((pageIndex-1)*pageSize+1)+"-"+((recordCount
???td.Controls.Add(lc);
??}
??private void BuildNavigator(TableCell td)
??{
???int temp;
???if(pageIndexshowPageNumber)
???{
????LinkButton lbBack=new LinkButton();
????lbBack.CausesValidation=false;
????lbBack.Text="...";
????lbBack.CommandArgument="Back";
????lbBack.Command +=new CommandEventHandler(lb_Click);
????td.Controls.Add(lbBack);
????td.Controls.Add(new LiteralControl(" "));
???}
???//*************************
???for(int i=0;i
???{
????if((pageStart+i)
????{
?????temp=pageStart+i;
?????LinkButton lbNumber=new LinkButton();
?????lbNumber.CausesValidation=false;
?????lbNumber.Text=temp.ToString();
?????lbNumber.CommandArgument=temp.ToString();
?????lbNumber.Command +=new CommandEventHandler(lbNumber_Click);
?????td.Controls.Add(lbNumber);
?????td.Controls.Add(new LiteralControl(" "));
????}
???}
???if((pageCount-pageStart)showPageNumber)
???{
????LinkButton lbForward=new LinkButton();
????lbForward.CausesValidation=false;
????lbForward.Text="...";
????lbForward.CommandArgument="Forward";
????lbForward.Command +=new CommandEventHandler(lb_Click);
????td.Controls.Add(lbForward);
???}
??}
??private void BuildGOTO(TableCell td)
??{
???TextBox tb=new TextBox();
???tb.ID="gotoPage";
???tb.BorderWidth=Unit.Pixel(1);
???tb.Width=Unit.Pixel(30);
???tb.EnableViewState=true;
???td.Controls.Add(tb);
???LiteralControl lc=new LiteralControl(" ");
???td.Controls.Add(lc);
???Button btn=new Button();
???btn.Text="GOTO";
???btn.CommandArgument=tb.ClientID;
???btn.Command +=new CommandEventHandler(lb_Click);
???td.Controls.Add(btn);
???RequiredFieldValidator val2=new RequiredFieldValidator();
???val2.ControlToValidate="gotoPage";
???val2.ErrorMessage="页码不能为空!";
???val2.Display=ValidatorDisplay.None;
???val2.ID="val2";
???td.Controls.Add(val2);
???RangeValidator val1=new RangeValidator();
???val1.Display=ValidatorDisplay.None;
???val1.ErrorMessage="无效的页码!";
???val1.ID="val1";
???val1.ControlToValidate="gotoPage";
???val1.Type=ValidationDataType.Integer;
???val1.MinimumValue="1";
???if(pageCount
???{
????val1.MaximumValue="1";
???}
???else
???{
????val1.MaximumValue=pageCount.ToString();
???}
???
???td.Controls.Add(val1);
???ValidationSummary valAll=new ValidationSummary();
???valAll.ShowMessageBox=true;
???valAll.ShowSummary=false;
???td.Controls.Add(valAll);
??}
??private void lb_Click(Object Sender,CommandEventArgs e)
??{
???switch(e.CommandArgument.ToString())
???{
????case "Back":
?????pageStart-=showPageNumber;
?????pageIndex=pageStart;
?????CreateChildControls();
?????break;
????case "Forward":
?????pageStart+=showPageNumber;
?????pageIndex=pageStart;
?????CreateChildControls();
?????break;
????default:
?????//TextBox tb=(TextBox)Parent.FindControl("CoolPager1:gotoPage");
??????? //pageIndex=Convert.ToInt32(tb.Text);
?????string temp=Page.Request.Form[this.ClientID+":gotoPage"].ToString().Trim();
?????try
?????{
??????pageIndex=Convert.ToInt32(temp);
??????if(pageIndex % showPageNumber==0)
??????{
???????pageStart=pageIndex+1-showPageNumber;
??????}
??????else
??????{
???????pageStart=(int)Math.Floor((double)pageIndex/showPageNumber)*showPageNumber+1;
??????}
??????CreateChildControls();
?????}
?????catch
?????{
?????}
?????break;
???}
???DataBind();
??}
??private void lbNumber_Click(Object Sender,CommandEventArgs e)
??{
???pageIndex=Convert.ToInt32(e.CommandArgument);
???DataBind();
??}
?}
}