Please refer this code.
Here Data is get only once from the Database and after that paging is done from ViewState DataTable.
HTML
<div>
<asp:DataList runat="server" ID="dlCustomers">
<HeaderTemplate>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<th>
Customer ID
</th>
<th>
CompanyName
</th>
<th>
ContactName
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%#Eval("CustomerId")%>
</td>
<td>
<%#Eval("CompanyName")%>
</td>
<td>
<%#Eval("ContactName")%>
</td>
</tr>
</ItemTemplate>
</asp:DataList>
<br />
<asp:Repeater ID="rptPager" runat="server">
<ItemTemplate>
<asp:LinkButton ID="lnkPage" runat="server" Text='<%#Eval("Text") %>' CommandArgument='<%# Eval("Value") %>'
CssClass='<%# Convert.ToBoolean(Eval("Enabled")) ? "page_enabled" : "page_disabled" %>'
OnClick="Page_Changed" OnClientClick='<%# !Convert.ToBoolean(Eval("Enabled")) ? "return false;" : "" %>'></asp:LinkButton>
</ItemTemplate>
</asp:Repeater>
</div>
Namespaces
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
C#
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.GerCustomers(1);
}
}
private void GerCustomers(int pageIndex)
{
DataTable dt = new DataTable();
if (ViewState["Customers"] == null)
{
string constr = ConfigurationManager.ConnectionStrings["ConStringNothwind"].ConnectionString;
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand("Customers_GetCustomers_RowNumber", con))
{
cmd.CommandType = CommandType.StoredProcedure;
using (SqlDataAdapter da = new SqlDataAdapter(cmd))
{
da.Fill(dt);
}
DataTable paggedtable = new DataTable();
paggedtable = dt.Clone();
int initial = (pageIndex - 1) * 10 + 1;
int last = initial + 10 - 1;
for (int i = initial; i < last; i++)
{
paggedtable.ImportRow(dt.Rows[i]);
}
this.dlCustomers.DataSource = paggedtable;
dlCustomers.DataBind();
ViewState["Customers"] = dt;
PopulatePager(dt.Rows.Count, pageIndex);
}
}
}
else
{
dt = (DataTable)ViewState["Customers"];
DataTable paggedtable = new DataTable();
paggedtable = dt.Clone();
int initial = (pageIndex - 1) * 10 + 1;
int last = initial + 10 - 1;
if (last > dt.Rows.Count)
{
last = dt.Rows.Count;
}
for (int i = initial; i < last; i++)
{
paggedtable.ImportRow(dt.Rows[i]);
}
this.dlCustomers.DataSource = paggedtable;
dlCustomers.DataBind();
PopulatePager(dt.Rows.Count, pageIndex);
}
}
protected void Page_Changed(object sender, EventArgs e)
{
int pageIndex = int.Parse((sender as LinkButton).CommandArgument);
this.GerCustomers(pageIndex);
}
private void PopulatePager(int recordCount, int currentPage)
{
List<ListItem> pages = new List<ListItem>();
int startIndex, endIndex;
int pagerSpan = 5;
//Calculate the Start and End Index of pages to be displayed.
double dblPageCount = (double)((decimal)recordCount / Convert.ToDecimal(10));
int pageCount = (int)Math.Ceiling(dblPageCount);
startIndex = currentPage > 1 && currentPage + pagerSpan - 1 < pagerSpan ? currentPage : 1;
endIndex = pageCount > pagerSpan ? pagerSpan : pageCount;
if (currentPage > pagerSpan % 2)
{
if (currentPage == 2)
{
endIndex = 5;
}
else
{
endIndex = currentPage + 2;
}
}
else
{
endIndex = (pagerSpan - currentPage) + 1;
}
if (endIndex - (pagerSpan - 1) > startIndex)
{
startIndex = endIndex - (pagerSpan - 1);
}
if (endIndex > pageCount)
{
endIndex = pageCount;
startIndex = ((endIndex - pagerSpan) + 1) > 0 ? (endIndex - pagerSpan) + 1 : 1;
}
//Add the First Page Button.
if (currentPage > 1)
{
pages.Add(new ListItem("First", "1"));
}
//Add the Previous Button.
if (currentPage > 1)
{
pages.Add(new ListItem("<<", (currentPage - 1).ToString()));
}
for (int i = startIndex; i <= endIndex; i++)
{
pages.Add(new ListItem(i.ToString(), i.ToString(), i != currentPage));
}
//Add the Next Button.
if (currentPage < pageCount)
{
pages.Add(new ListItem(">>", (currentPage + 1).ToString()));
}
//Add the Last Button.
if (currentPage != pageCount)
{
pages.Add(new ListItem("Last", pageCount.ToString()));
}
rptPager.DataSource = pages;
rptPager.DataBind();
}
StoredProcedure
CREATE PROCEDURE [dbo].[Customers_GetCustomers_RowNumber]
AS
BEGIN
SET NOCOUNT ON;
SELECT ROW_NUMBER() OVER
(
ORDER BY CustomerID ASC
) AS RowNumber
,[CustomerID]
,[CompanyName]
,[ContactName]
FROM Customers
END
GO
Database
Install Microsoft Northwind and Pubs Sample databases in SQL Server Management Studio
Screenshot
