Normally DataRepeater doesn’t have a paging feature; and you can implement it using LINQ, if you are using .Net 3.5. Here is an implementation which is using SQL Server 2005 feature ROW_NUMBER(). You can get more information about ROW_NUMBER() from MSDN.
Stored Procedure – xsp_GetPersons
CREATE PROCEDURE xsp_GetPersons @StartIndex INT, @Count INT AS BEGIN DECLARE @EndIndex INT SET @StartIndex = @StartIndex * @Count SET @EndIndex = @StartIndex + @Count SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY UserId DESC) AS SlNo, UserId, FirstName, LastName, Email, ISNULL(DOB, GETDATE()) AS DOB FROM U_MyRegistration)Registration WHERE Registration.SlNo BETWEEN @StartIndex AND @EndIndex END
And I added a DataRepeater control, with Next and Previous buttons in the Footer.
<tr>
<td colspan="3" align="left">
<asp:LinkButton CommandName="Navigation" CommandArgument="Prev" runat="server" ID="linkPrevious"
Text="<< Previous" />
</td>
<td colspan="3" align="right">
<asp:LinkButton CommandName="Navigation" CommandArgument="Next" runat="server" ID="linkNext" Text="Next >>" />
</td>
</tr>
Code behind. As it is a sample code, I am not added any validations.
int count = 10;
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
BindData(); //Binding Data.
}
}
private void BindData()
{
int startIndex = Convert.ToInt32(this.hidCurrentIndex.Value);
Persons p = new Persons();
this.Repeater1.DataSource = null;
this.Repeater1.DataSource = p.GetPersons(startIndex, count);
this.Repeater1.DataBind();
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName.Equals("Navigation",
StringComparison.CurrentCultureIgnoreCase))
{
if (e.CommandArgument.ToString().Equals("Prev",
StringComparison.CurrentCultureIgnoreCase))
{
this.hidCurrentIndex.Value = (Convert.ToInt32
(this.hidCurrentIndex.Value) - 1).ToString(); //Decrementing the count
this.BindData();
}
else
{
this.hidCurrentIndex.Value = (Convert.ToInt32
(this.hidCurrentIndex.Value) + 1).ToString(); //Incrementing the count
this.BindData();
}
}
}
And the implementation of Persons class from App_Code
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
public class Persons : List<Persons.Person>
{
public class Person
{
public int UserId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
public DateTime DOB { get; set; }
}
public Persons GetPersons(int startIndex, int count)
{
Persons persons = new Persons();
using (SqlConnection connection = new SqlConnection ("Server=.\SQLEXPRESS;User Id=sa;Password=sapwd;Database=myDatabase"))
{
connection.Open();
using (SqlCommand command = new SqlCommand("xsp_GetPersons",
connection))
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.Parameters.AddWithValue("@StartIndex", startIndex);
command.Parameters.AddWithValue("@Count", count);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
persons.Add(new Person()
{
DOB = Convert.ToDateTime(reader["DOB"].ToString()),
Email = reader["Email"].ToString(),
FirstName = reader["FirstName"].ToString(),
LastName = reader["LastName"].ToString(),
UserId = Convert.ToInt32(reader["UserId"].ToString()),
});
}
}
}
return persons;
}
}
The core thing is stored procedure, which will return the results based on the given index. Thanks to Aneesh for the details of ROW_NUMBER() function.