View Code
using System;
using System.Text;
using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.IO;
using System.Web.UI;
using System.Globalization;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Demo
{
public interface IPageIndexChangedEventHandler
{
void BindData(int pageIndex, int pageSize);
}
public class AjaxPager : Control, ICallbackEventHandler, INamingContainer
{
#region Member Variables
private int lowerBound;
private int upperBound;
private HyperLink previousLink;
private HyperLink nextLink;
private HyperLink firstLink;
private HyperLink lastLink;
private Control targetControl;
#endregion
#region Public Properties
public int PageIndex
{
get
{
int pageIndex = 1;
if (Page != null && Page.IsPostBack && ViewState["PageIndex"] != null)
{
pageIndex = (int)ViewState["PageIndex"];
}
if (pageIndex < 1)
{
return 1;
}
else
{
return pageIndex;
}
}
set
{
ViewState["PageIndex"] = value;
}
}
public int PageSize
{
get
{
int pageSize = Convert.ToInt32(ViewState["PageSize"]);
if (pageSize <= 0)
{
return 10;
}
return pageSize;
}
set
{
ViewState["PageSize"] = value;
}
}
public int LeftLength
{
get
{
return PageLength / 2;
}
}
public int RightLength
{
get
{
return PageLength / 2;
}
}
public int PageLength
{
get
{
int pageLength = Convert.ToInt32(ViewState["PageLength"]);
if (pageLength <= 3)
return 3;
if (pageLength % 2 == 0)
{
return pageLength + 1;
}
return pageLength;
}
set
{
ViewState["PageLength"] = value;
}
}
public int TotalPages
{
get
{
return CalculateTotalPages(TotalRecords);
}
}
public int TotalRecords
{
get
{
return Convert.ToInt32(ViewState["TotalRecords"]);
}
set
{
ViewState["TotalRecords"] = value;
}
}
public string DataWrapperID
{
get
{
string s = ViewState["DataWrapperID"] as string;
if (s == null)
{
s = string.Empty;
}
return s;
}
set
{
ViewState["DataWrapperID"] = value;
}
}
public string TargetControlID
{
get
{
string s = ViewState["TargetControlID"] as string;
if (s == null)
{
s = string.Empty;
}
return s;
}
set
{
ViewState["TargetControlID"] = value;
}
}
#endregion
#region Overrides Methods
protected override void OnLoad(EventArgs e)
{
if (!Page.IsPostBack)
{
CreatePageLinks();
RegisterClientScripts();
}
else
{
targetControl = FindControl(this, TargetControlID);
}
}
protected override void Render(HtmlTextWriter writer)
{
if (TotalPages <= 1)
{
return;
}
RenderFirst(writer);
RenderPrevious(writer);
RenderPagingButtons(writer);
RenderNext(writer);
RenderLast(writer);
}
#endregion
#region Public Methods
public virtual int CalculateTotalPages(int totalRecords)
{
int totalPagesAvailable;
if (totalRecords == 0)
{
return 0;
}
totalPagesAvailable = totalRecords / PageSize;
if ((totalRecords % PageSize) > 0)
{
totalPagesAvailable++;
}
return totalPagesAvailable;
}
#endregion
#region ICallbackEventHandler Implementation
public void RaiseCallbackEvent(string pageIndex)
{
int currentPageIndex = int.Parse(pageIndex);
if (currentPageIndex != PageIndex)
{
((IPageIndexChangedEventHandler)targetControl).BindData(currentPageIndex, PageSize);
}
PageIndex = currentPageIndex;
CreatePageLinks();
}
public string GetCallbackResult()
{
return RenderControl(targetControl);
}
#endregion
#region Helpers
private void RenderFirst(HtmlTextWriter writer)
{
if ((PageIndex > LeftLength + 1) && (TotalPages > PageLength))
{
firstLink.RenderControl(writer);
LiteralControl l = new LiteralControl(" ... ");
l.RenderControl(writer);
}
}
private void RenderLast(HtmlTextWriter writer)
{
if (((PageIndex + RightLength) < TotalPages) && (TotalPages > PageLength))
{
LiteralControl l = new LiteralControl(" ... ");
l.RenderControl(writer);
lastLink.RenderControl(writer);
}
}
private void RenderPrevious(HtmlTextWriter writer)
{
if (PageIndex > 1)
{
previousLink.RenderControl(writer);
Literal l = new Literal();
l.Text = " ";
l.RenderControl(writer);
}
}
private void RenderNext(HtmlTextWriter writer)
{
if (PageIndex < TotalPages)
{
Literal l = new Literal();
l.Text = " ";
l.RenderControl(writer);
nextLink.RenderControl(writer);
}
}
private void RenderButtonRange(int start, int end, HtmlTextWriter writer)
{
for (int i = start; i <= end; i++)
{
if (PageIndex == i)
{
Literal l = new Literal();
//l.Text = "<span class=\"currentPage\">[" + i.ToString() + "]</span>";
l.Text = i.ToString();
l.RenderControl(writer);
}
else
{
Controls[i - start].RenderControl(writer);
}
if (i < end)
{
writer.Write(" ");
}
}
}
private void RenderPagingButtons(HtmlTextWriter writer)
{
RenderButtonRange(lowerBound, upperBound, writer);
}
private string RenderControl(Control control)
{
StringWriter writer1 = new StringWriter(CultureInfo.InvariantCulture);
HtmlTextWriter writer2 = new HtmlTextWriter(writer1);
control.RenderControl(writer2);
writer2.Flush();
writer2.Close();
return writer1.ToString();
}
private string CreateOnClickScript(int pageIndex)
{
return string.Format("javascript:turnPage({0});", pageIndex);
}
private void InitPageBounds()
{
lowerBound = PageIndex - LeftLength;
upperBound = PageIndex + RightLength;
if (lowerBound < 1)
{
upperBound += 1 - lowerBound;
lowerBound = 1;
}
if (upperBound > TotalPages)
{
lowerBound -= upperBound - TotalPages;
upperBound = TotalPages;
}
if (lowerBound < 1)
{
lowerBound = 1;
}
if (upperBound > TotalPages)
{
upperBound = TotalPages;
}
}
private void AddPageLinks()
{
InitPageBounds();
HyperLink link;
for (int i = lowerBound; i <= upperBound; i++)
{
link = new HyperLink();
link.EnableViewState = false;
link.Text = i.ToString();
link.ID = i.ToString();
link.NavigateUrl = CreateOnClickScript(i);
Controls.Add(link);
}
}
private void AddFirstLastLinks()
{
firstLink = new HyperLink();
firstLink.ID = "First";
firstLink.Text = "第一页";
firstLink.NavigateUrl = CreateOnClickScript(1);
Controls.Add(firstLink);
lastLink = new HyperLink();
lastLink.ID = "Last";
lastLink.Text = "最后一页";
lastLink.NavigateUrl = CreateOnClickScript(TotalPages);
Controls.Add(lastLink);
}
private void AddPreviousNextLinks()
{
previousLink = new HyperLink();
previousLink.ID = "Prev";
previousLink.Text = "上一页";
previousLink.NavigateUrl = CreateOnClickScript(PageIndex - 1);
Controls.Add(previousLink);
nextLink = new HyperLink();
nextLink.ID = "Next";
nextLink.Text = "下一页";
nextLink.NavigateUrl = CreateOnClickScript(PageIndex + 1);
Controls.Add(nextLink);
}
private void CreatePageLinks()
{
Controls.Clear();
AddPageLinks();
AddPreviousNextLinks();
AddFirstLastLinks();
}
private void RegisterClientScripts()
{
string turnPageScript = "function turnPage(pageIndex) { CallServer(pageIndex,'" + DataWrapperID + "');}";
string receiveCallBackScript = "function ReceiveCallback(arg,context){ document.getElementById(context).innerHTML = arg; }";
string callbackReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveCallback", "context", false);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "TurnPageScript", turnPageScript, true);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "ReceiveCallBackScript", receiveCallBackScript, true);
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), this.ClientID + "CallServer", string.Format("function CallServer(arg,context){{ {0} }}", callbackReference), true);
}
static Control FindControl(Control container, string id)
{
if ((container == null) || string.IsNullOrEmpty(id))
{
return null;
}
if (!(container is INamingContainer) && (container.NamingContainer != null))
{
container = container.NamingContainer;
}
Control control = FindControlInternal(container, id, null);
if (control == null)
{
Dictionary<Control, bool> dictionary = new Dictionary<Control, bool>();
dictionary[container] = true;
container = container.NamingContainer;
while ((container != null) && (control == null))
{
control = FindControlInternal(container, id, dictionary);
dictionary[container] = true;
container = container.NamingContainer;
}
}
return control;
}
static Control FindControlInternal(Control control1, string text1, Dictionary<Control, bool> dictionary1)
{
if (control1.ID == text1)
{
return control1;
}
Control control = control1.FindControl(text1);
if ((control != null) && (control.ID == text1))
{
return control;
}
foreach (Control control2 in control1.Controls)
{
if ((dictionary1 == null) || !dictionary1.ContainsKey(control2))
{
control = FindControlInternal(control2, text1, dictionary1);
if (control != null)
{
return control;
}
}
}
return null;
}
#endregion
}
}
<nwap:AjaxPager ID="pager" PageLength="50" TargetControlID="StudentList" DataWrapperID="container" runat="server" PageSize="10" />
View Code
public List<Student> GetStudents(int pageIndex, int pageSize, ref int totalCount)
{
int lowerIndex = (pageIndex - 1) * pageSize + 1;
int upperIndex = pageIndex * pageSize;
List<Student> students = new List<Student>();
OleDbConnection conn = new OleDbConnection();
conn.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TDOWN\源码\ASP.NET AJAX无刷新分页演示包(含控件)\codefans.net\Demo\db.mdb;Jet OLEDB:Database Password=;Persist Security Info=False";
OleDbCommand cmd = conn.CreateCommand();
conn.Open();
cmd.CommandText = "select count(*) from students";
totalCount = (int)cmd.ExecuteScalar();
cmd.CommandText = string.Format("select * from students where id >= {0} and id <= {1}", lowerIndex, upperIndex);
OleDbDataReader reader = cmd.ExecuteReader();
Student student = null;
while (reader.Read())
{
student = new Student();
student.Id = (int)reader[0];
student.Name = (string)reader[1];
student.Age = (int)reader[2];
students.Add(student);
}
reader.Close();
reader.Dispose();
conn.Close();
conn.Dispose();
return students;
}