You have to implement your own custom paging with a repeater. The difficult
part arises from actually doing the paging of your datasource. DataGrid
achieves this by doing it all on the client (web server) which can be a real
performance killer for high-stress applications. You can use a control like
the following to actually display paging information (prev 1 2 3 4 5 next)
and expose events when a page is changed, but again you'll need to figure
out how best to bind your datasource:
using System;
using System.Globalization;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Utility {
public class Pager : WebControl, IPostBackEventHandler {
#region Fields and Properties
public int CurrentPage {
get {
if (ViewState["CurrentPage"] == null) {
return 1;
}
return Convert.ToInt32(ViewState["CurrentPage"],
CultureInfo.InvariantCulture);
}
set { ViewState["CurrentPage"] = value; }
}
public int TotalItems {
get {
if (ViewState["TotalItems"] == null) {
return 1;
}
return Convert.ToInt32(ViewState["TotalItems"],
CultureInfo.InvariantCulture);
}
set { ViewState["TotalItems"] = value; }
}
public int ItemsPerPage {
get {
if (ViewState["ItemsPerPage"] == null) {
return 1;
}
return Convert.ToInt32(ViewState["ItemsPerPage"],
CultureInfo.InvariantCulture);
}
set { ViewState["ItemsPerPage"] = value; }
}
public event CommandEventHandler PageClick;
#endregion
private void OnPageClick(object sender, CommandEventArgs e) {
if (PageClick != null) {
PageClick(sender, e);
}
}
protected override void Render(HtmlTextWriter writer) {
if (Page != null) {
Page.VerifyRenderingInServerForm(this);
}
base.Render(writer);
}
protected override void RenderContents(HtmlTextWriter writer) {
int totalPages = (int)Math.Ceiling(TotalItems / ItemsPerPage);
if (totalPages == 1 || totalPages == 0) {
return;
}
if (CurrentPage > 1) {
writer.AddAttribute(HtmlTextWriterAttribute.Href,
Page.GetPostBackClientHyperlink(this, (CurrentPage -
1).ToString(CultureInfo.InvariantCulture)));
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID
+ "

rev");
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write("prev");
writer.RenderEndTag();
writer.Write(HtmlTextWriter.SpaceChar);
}
for (int i = 1; i <= totalPages; ++i) {
string page = i.ToString(CultureInfo.InvariantCulture);
if (i == CurrentPage) {
writer.RenderBeginTag(HtmlTextWriterTag.B);
writer.Write(page);
writer.RenderEndTag();
writer.Write(HtmlTextWriter.SpaceChar);
} else {
writer.AddAttribute(HtmlTextWriterAttribute.Href,
Page.GetPostBackClientHyperlink(this, page));
writer.AddAttribute(HtmlTextWriterAttribute.Name,
this.UniqueID + ":" + page);
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write(page);
writer.RenderEndTag();
writer.Write(HtmlTextWriter.SpaceChar);
}
}
if (CurrentPage < totalPages) {
writer.AddAttribute(HtmlTextWriterAttribute.Href,
Page.GetPostBackClientHyperlink(this, (CurrentPage +
1).ToString(CultureInfo.InvariantCulture)));
writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID
+ ":next");
writer.RenderBeginTag(HtmlTextWriterTag.A);
writer.Write("next");
writer.RenderEndTag();
writer.Write(HtmlTextWriter.SpaceChar);
}
}
public void RaisePostBackEvent(string eventArgument) {
CurrentPage = Convert.ToInt32(eventArgument,
CultureInfo.InvariantCulture);
CommandEventArgs e = new CommandEventArgs("PageClick",
eventArgument);
OnPageClick(this, e);
}
}
}
Karl