As everyone probably know and have tried, is the ASP.NET integrated paging system in the data sources, but it's not always it fits your solution. That's why i want to show you how i make simple data paging using query.
Getting data access
To start off we need to get access to the database, to do this i use LINQ by creating a .dbml file, within this example contains products from the sample database Northwind.
I'm creating a simple method to get the data out:
public static List<Product> GetProducts()
{
PagingDataContext db = new PagingDataContext();
return (from p in db.Products
select p).ToList();
}
I will use the skip and take in linq to make the paging:
.Skip(skip).Take(take);
Create paging class
Now we need the class that can convert pageNumber and pageSize to skip and take, in my case I've made a Paging object that can contain the take, skip and totalPages integers:
public static Paging GetTakeAndSkip(int pageNumber, int pageSize)
{
int take = pageSize;
int skip = (pageNumber - 1) * pageSize;
//(totalProducts / pageSize)
int totalPages = Int32.Parse(Math.Ceiling(decimal.Parse(ProductService.GetProducts().Count().ToString()) / decimal.Parse(pageSize.ToString())).ToString());
return new Paging(take, skip, totalPages);
}
Putting it all together
This is just databound to a gridView to give you an example, and the page size is defined in the query. You can make a drobdownlist or so to handle how many to be displayed, but that's not made in this example:
int pageNumber;
int pageSize;
Paging pagingItem;
protected void Page_Load(object sender, EventArgs e)
{
//Request the queries, to make it more secure
//put IsNullOrEmpty and tryParse arround.
pageNumber = Int32.Parse(Request.QueryString["page"]);
pageSize = Int32.Parse(Request.QueryString["size"]);
//Requesting the Method in the paging class
pagingItem = Paging.GetTakeAndSkip(pageNumber, pageSize);
//This keeps track of the number and size
LitPagePlace.Text = string.Format("{0}/{1}", pageNumber, pagingItem.TotalPages);
//Using the skip and take on our method to get products
GridProducts.DataSource = ProductService.GetProducts().Skip(pagingItem.Skip).Take(pagingItem.Take);
GridProducts.DataBind();
}
protected void LinkNext_Click(object sender, EventArgs e)
{
//This will make it stop paging,
//when the last page is reached
if (pagingItem.TotalPages > pageNumber)
{
//replacing and redirecting to the next page
Response.Redirect(Request.RawUrl.Replace(string.Format("page={0}", pageNumber),
string.Format("page={0}", pageNumber + 1)));
}
}
protected void LinkPrev_Click(object sender, EventArgs e)
{
//This will make it stop paging,
//when the first page is reached
if (1 < pageNumber)
{
//replacing and redirecting to the previous page
Response.Redirect(Request.RawUrl.Replace(string.Format("page={0}", pageNumber),
string.Format("page={0}", pageNumber - 1)));
}
}