Skip to main content
replaced http://stackoverflow.com/ with https://stackoverflow.com/
Source Link
added 9083 characters in body
Source Link
LCJ
  • 333
  • 4
  • 15

Points of interest

  1. It uses Link Buttons as suggested in http://stackoverflow.com/questions/14335067/passing-search-parameters-to-same-page-when-hyperlink-clicked
  2. The link buttons are added in Page_Load itself as listed in http://stackoverflow.com/questions/14364332/dynamic-controls-event-handlers-working
  3. It is made as user control for reuse

QUESTIONS

Helper ClassUser Control Markup

namespace WebApplication1
{

public static class PagingHelper
{
    public static PagingInfo GetPageHyperlinks(int totalRecordsInTable, int pageSize, int currentIndex, string requestUrl)
    {

        PagingInfo pagingInfo = new PagingInfo();
    <%@ Control Language="C#" AutoEventWireup="true" pagingInfoCodeBehind="PagingUserControl.LinksToAdd = new Collection<HyperLink>();

        string url = requestUrl;
        int position = requestUrlascx.IndexOf('?');
        if (position > 0)
        {cs"
            url = requestUrlInherits="PagingTestWebApplication.Substring(0, position);
        }


        if (totalRecordsInTable > 0)
        {

            int itemsBeforeCurrentPage = 4;
            int itemsAfterCurrentPage = 2;
            int itemsCountInMiddleSection = itemsBeforeCurrentPage + 1 + itemsAfterCurrentPage;

            //string templates for links
            string link = "<a  href='" + url + "?Index=[Index]&amp;Size=[Size]'><spanPagingUserControl" class='page-numbers'>##Text##</span></a>";%>
            string link_pre = "<a href='" + url +<div "?Index=[Index]&amp;Size=[Size]'><spanclass="pagingSection" class='page-numbersid="pagingSection" prev'>##Text##</span></a>";runat="server">
            string link_next = "<a href='" + url<asp:LinkButton +ID="lnkPrevious" "?Index=[Index]&amp;Size=[Size]'><spanrunat="server" class='pageCssClass='page-numbers next'>##Text##</span></a>";


            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

          prev' Visible="false" /OnClick="LinkButton_Click">Prev</Generate dynamic paging 
            int start;
            if (currentIndex <= (itemsBeforeCurrentPage + 1))
            {
                start = 1;
            }
            else
            {asp:LinkButton>
                start<asp:LinkButton =ID="lnkFirst" currentIndexrunat="server" CssClass='page- itemsBeforeCurrentPage;
            }

            int lastAddedLinkIndex = 0;
            int? firtsAddedLinkIndex = null;

            for (int i = start; i < start + itemsCountInMiddleSection; i++)
            {

                if (i > numberOfPagesRequired)
                {
                    //do not add more links if exceeded limit
                    continue;
                }

                //create dynamic HyperLinks 
                HyperLink lnk = new HyperLink();
                lnk.ID = "lnk_" + i.ToString();
                lnk.Text = i.ToString();
                lnk.Text = i.ToString();
                lastAddedLinkIndex = i;

                if (firtsAddedLinkIndex == null)
                {
                    firtsAddedLinkIndex = i;
               numbers' }

Visible="false"
                /OnClick="LinkButton_Click">1</Check whetehr current page
                if (i == currentIndex)
                {asp:LinkButton>
                   <asp:Label lnk.CssClassrunat="server" =ID="lblFirstDots" "pageCssClass="page-numbers current";
                }
                else
                {
                    lnk.CssClass =prev" "page-numbers";Visible="false"
                    lnkText=".NavigateUrl = url + "?Index=" + i + "&Size=" + pageSize + "";
                }

                
                pagingInfo.LinksToAdd.Add(lnk);
            }


            if (numberOfPagesRequired > itemsCountInMiddleSection)
            {
                /"></Set dots (ellipse) visibility
                pagingInfo.IsEndDotsVisible = lastAddedLinkIndex == numberOfPagesRequired ? false asp: true;Label>
                pagingInfo.IsStartDotsVisible = firtsAddedLinkIndex <= 2 ? false <asp: true;

              PlaceHolder ID="plhDynamicLink" /runat="server"></First and Last Page Links
                pagingInfo.IsLastLinkVisible = lastAddedLinkIndex == numberOfPagesRequired ? false asp: true;PlaceHolder>
                pagingInfo.IsFirstLinkVisible = firtsAddedLinkIndex == 1 ? false <asp: true;

                pagingInfo.LastLinkTextLabel =runat="server" link.Replace("[Index]",ID="lblSecondDots" numberOfPagesRequired.ToString()).Replace("[Size]",Visible="false" pageSize.ToString()).Replace("##Text##",CssClass="page-numbers numberOfPagesRequired.ToString());prev"
                pagingInfo.FirstLinkText = link.Replace("[Index]", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString())Text=".Replace("[Size]", pageSize.ToString()).Replace("##Text##", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString());
            }


            /"></For first page, there is no previous
            if (currentIndex != 1)
            {asp:Label>
                pagingInfo.PreviousLinkText = link_pre.Replace("[Size]",<asp:LinkButton pageSize.ToString()).Replace("[Index]",ID="lnkLast" (currentIndexrunat="server" CssClass='page- 1).ToString()).Replace("##Text##", "Prev");
                
            }
            else
           numbers' {Visible="false"
                /OnClick="LinkButton_Click">Last</Hyperlink is replaced with textasp:LinkButton>
                pagingInfo.PreviousLinkText<asp:LinkButton =ID="lnkNext" "<spanrunat="server" class='pageCssClass='page-numbers prev'>Prev</span>";
            }


            //For last page there is no Next
            if (currentIndex != Convert.ToInt32(numberOfPagesRequired))
            {
                pagingInfo.NextLinkText = link_next.Replace("[Size]", pageSize.ToString()).Replace("[Index]", (currentIndex + 1).ToString()).Replace("##Text##", "Next");
                
            }
            else
            {
              next' Visible="false" /OnClick="LinkButton_Click">Next</Hyperlink is replaced with textasp:LinkButton>
                pagingInfo.NextLinkText = "<span class='page-numbers next'>Next<</span>";
            }

        }
        return pagingInfo;
    }
}
}div>

Data Transfer ClassUser Control Code Behind

public partial class PagingInfoPagingUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public Collection<HyperLink>int LinksToAddPreviousIndex { get; set; }
    public bool?int IsEndDotsVisibleCurrentClickedIndex { get; set; } 

    public bool?event IsStartDotsVisibleEventHandler PaginationLinkClicked;

    protected void LinkButton_Click(object sender, EventArgs e)
    { 
 get; set;      //Assumption: Text of the LinkButton will be same as index
        LinkButton clickedLinkButton = (LinkButton)sender;

        if (String.Equals(clickedLinkButton.Text, "Next"))
        {
            //Next Page index will be one greater than current
            //Note: If the current index is the last page, "Next" control will be in disabled state
            CurrentClickedIndex = PreviousIndex + 1;
        }
        else if (String.Equals(clickedLinkButton.Text, "Prev"))
        {
            //Previous Page index will be one less than current
            //Note: If the current index is the first page, "Prev" control will be in disabled state
            CurrentClickedIndex = PreviousIndex - 1;
        }
        else
        {
            CurrentClickedIndex = Convert.ToInt32(clickedLinkButton.Text, CultureInfo.InvariantCulture);
        }

        //Raise event
        if (this.PaginationLinkClicked != null)
        {
            this.PaginationLinkClicked(clickedLinkButton, e);
        } 

    }

    public bool?void IsFirstLinkVisiblePreAddAllLinks(int tableDataCount,int pageSize,  int currentIndex)
    { 
 get; set;      if (tableDataCount > 0)
        {
            PagingInfo info = PagingHelper.GetAllLinks(tableDataCount, pageSize, currentIndex);

            //Remove all controls from the placeholder
            plhDynamicLink.Controls.Clear();

            if (info.PaginationLinks != null)
            {
                foreach (LinkButton link in info.PaginationLinks)
                {
                    //Adding Event handler must be done inside Page_Laod /Page_Init
                    link.Click += new EventHandler(LinkButton_Click);

                    //Validation controls should be executed before link click.
                    link.ValidationGroup = "Search";
                    this.plhDynamicLink.Controls.Add(link);
                }
            }

        }
    }

    public boolvoid AddPageLinks(int tableDataCount, int pageSize, int index)
    {

        if (tableDataCount > 0)
        {
            pagingSection.Visible = true;
            PagingInfo info = PagingHelper.GetPageLinks(tableDataCount, pageSize, index);

            //Remove all controls from the placeholder
            plhDynamicLink.Controls.Clear();

            if (info.PaginationLinks != null)
            {
                lnkPrevious.Visible = info.PaginationLinks.Count > 0 ? true : false;
                lnkNext.Visible = info.PaginationLinks.Count > 0 ? true : false;

                foreach (LinkButton link in info.PaginationLinks)
                {
                    //Validation controls should be executed before link click.
                    link.ValidationGroup = "Search";
                    this.plhDynamicLink.Controls.Add(link);
                }
            }
            

            //Dots visiblity
            if (info.IsEndDotsVisible != null)
            {
                lblSecondDots.Visible = Convert.ToBoolean(info.IsEndDotsVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lblSecondDots.Visible = false;
            }

            if (info.IsStartDotsVisible != null)
            {
                lblFirstDots.Visible = Convert.ToBoolean(info.IsStartDotsVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lblFirstDots.Visible = false;
            }

            //First and Last Links
            if (info.IsFirstLinkVisible != null)
            {
                lnkFirst.Visible = Convert.ToBoolean(info.IsFirstLinkVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lnkFirst.Visible = false;
            }

            if (info.IsLastLinkVisible != null)
            { 
 get; set;              lnkLast.Visible = Convert.ToBoolean(info.IsLastLinkVisible, CultureInfo.InvariantCulture);
                lnkLast.Text = info.NumberOfPagesRequired.ToString(CultureInfo.InvariantCulture);
            }
    public string FirstLinkText      else
            { 
 get; set;              lnkLast.Visible = false;
            } 


    public string LastLinkText      //For first page, there is no previous
            if (index != 1 && info.NumberOfPagesRequired != 1)
            { 
 get; set;              lnkPrevious.Enabled = true;
            }
    public string PreviousLinkText      else
            { 
 get; set;              lnkPrevious.Enabled = false;
            } 


    public string NextLinkText      //For last page there is no Next
            if (index != info.NumberOfPagesRequired && info.NumberOfPagesRequired != 1)
            { 
 get; set;              lnkNext.Enabled = true;
            }
            else
            {
                lnkNext.Enabled = false;
            }
        }
        else
        {
            pagingSection.Visible = false;
        }

    }

 }

Code Behind DTO

namespace WebApplication1
{
public partial class Test : System.Web.UI.Page
{


    protected void Page_Load(object sender, EventArgs e)
    {
        int size = 0; int index = 0;

        if (!Page.IsPostBack)
        {
            

            string test =   this.Page.Request.Url.ToString();
            string sizeTest = Request["Size"];
            string indexTest = Request["Index"];

            size = string.IsNullOrEmpty(Request["Size"]) ? 5 : Convert.ToInt32(Request["Size"]);
            index = string.IsNullOrEmpty(Request["Index"]) ? 1 : Convert.ToInt32(Request["Index"]);


            //load data from database
            BindGrid(size, index);

        }
    }

    void BindGrid(int pageSize, int index)
    {

        try
        {

            string ConnStr = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";


            //the sql query with paging logics
            String SQL = @"select * from 
                        (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as row,*
                         FROM Employee) tblTemp
                         WHERE row between (" + index + " - 1) * " + pageSize + " + 1 and " + index + "*" + pageSize + " ";
                                              


            SQL += " select COUNT(*) from Employee";


            //fetching data from database suing SqlDataAdapter Fill method to bind the Gridview
            SqlDataAdapter ad = new SqlDataAdapter(SQL, ConnStr);
            DataSet ds = new DataSet();
            ad.Fill(ds);


            this.gvPaging.DataSource = ds.Tables[0];
            this.gvPaging.DataBind();

            DataTable tableForData = ds.Tables[0];
            DataTable tableForRowCount = ds.Tables[1];
            int totalRecordsInTable = Convert.ToInt32(tableForRowCount.Rows[0][0]);

           

            PagingInfo info = PagingHelper.GetPageHyperlinks(totalRecordsInTable, pageSize, index, this.Page.Request.Url.ToString());
            if(info.LinksToAdd!=null)
            {
                foreach (HyperLink link in info.LinksToAdd)
             public Collection<LinkButton> PaginationLinks {
                    this.pl.Controls.Add(link);
                }
          get; set; }

            //Dots visiblity
           public ifbool? (info.IsEndDotsVisible != null)
            {
                spDot2.Visible = Convert.ToBoolean(info.IsEndDotsVisible);
          get; set; }
 
           public ifbool? (info.IsStartDotsVisible != null)
            {
                spDot1.Visible = Convert.ToBoolean(info.IsStartDotsVisible);
          get; set; }
 
            //First and Last Links
           public ifbool? (info.IsFirstLinkVisible != null)
            {
                lblIst.Visible = Convert.ToBoolean(info.IsFirstLinkVisible); 
                lblIst.Text = info.FirstLinkText;
          get; set; }
           public ifbool? (info.IsLastLinkVisible != null)
            {
                lblLast.Visible = Convert.ToBoolean(info.IsLastLinkVisible); 
                lblLast.Text = info.LastLinkText;
            }

            //Pre and Next
            lblpre.Text = info.PreviousLinkText;
            lblnext.Text = info.NextLinkText;

           


      get; set; }
        catch (Exception ee)
     public int NumberOfPagesRequired {
            //catch the exception
        }
  get; set; }

}

}

Helper

public static class PagingHelper
{
    public static PagingInfo GetAllLinks(int totalRecordsInTable, int pageSize, int previousIndex)
    {
        
        string LinkButtonIDPrefix = "lnK";
        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.PaginationLinks = new Collection<LinkButton>();

        if (totalRecordsInTable > 0)
        {
            int itemsBeforePage = 4;
            int itemsAfterPage = 2;
            int dynamicDisplayCount = itemsBeforePage + 1 + itemsAfterPage;

            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            if (numberOfPagesRequired == 0)
            {
                numberOfPagesRequired = 1;
            }


            //Note: This function adds only the probable Links that the user can click (based on previous click).
            //This is needed sice dynamic controls need to be added while Page_Load itself for event handlers to work
            //In case of any bug, easiest way is add all links from 1 to numberOfPagesRequired
            //Following is an optimized way

            int endOfLeftPart = dynamicDisplayCount;
            //User may click "1". So the first 7 items may be required for display. Hence add them for event handler purpose
            for (int i = 1; i <= endOfLeftPart; i++)
            {
                //Create dynamic Links 
                LinkButton lnk = new LinkButton();
                lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                pagingInfo.PaginationLinks.Add(lnk);
            }


            int startOfRighPart = Convert.ToInt32(numberOfPagesRequired) - dynamicDisplayCount + 1;

            //User may click the last link. So the last 7 items may be required for display. Hence add them for event handler purpose
            for (int i = startOfRighPart; i <= Convert.ToInt32(numberOfPagesRequired); i++)
            {
                //Links already added should not be added again
                if (i > endOfLeftPart)
                {
                    //Create dynamic Links 
                    LinkButton lnk = new LinkButton();
                    lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                    lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                    pagingInfo.PaginationLinks.Add(lnk);
                }
            }

            //User may click on 4 items before current index as well as 2 items after current index
            for (int i = (previousIndex - itemsBeforePage); i <= (previousIndex + itemsAfterPage); i++)
            {
                //Links already added should not be added again
                if (i > endOfLeftPart && i < startOfRighPart)
                {
                    //Create dynamic Links 
                    LinkButton lnk = new LinkButton();
                    lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                    lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                    pagingInfo.PaginationLinks.Add(lnk);
                }
            }



        }
        return pagingInfo;
    }
    public static PagingInfo GetPageLinks(int totalRecordsInTable, int pageSize, int currentIndex)
    {
        string LinkButtonIDPrefix = "lnK";
        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.PaginationLinks = new Collection<LinkButton>();

        if (totalRecordsInTable > 0)
        {

            int itemsBeforePage = 4;
            int itemsAfterPage = 2;
            int dynamicDisplayCount = itemsBeforePage + 1 + itemsAfterPage;

            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            if (numberOfPagesRequired == 0)
            {
                numberOfPagesRequired = 1;
            }

            //Generate dynamic paging 
            int start;
            if (currentIndex <= (itemsBeforePage + 1))
            {
                start = 1;
            }
            else
            {
                start = currentIndex - itemsBeforePage;
            }

            int lastAddedLinkIndex = 0;
            int? firtsAddedLinkIndex = null;

            for (int i = start; i < start + dynamicDisplayCount; i++)
            {

                if (i > numberOfPagesRequired)
                {
                    break;
                }

                //Create dynamic Links 
                LinkButton lnk = new LinkButton();
                lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                lastAddedLinkIndex = i;

                if (firtsAddedLinkIndex == null)
                {
                    firtsAddedLinkIndex = i;
                }


                //Check whetehr current page
                if (i == currentIndex)
                {
                    lnk.CssClass = "page-numbers current";
                }
                else
                {
                    lnk.CssClass = "page-numbers";
                }

                pagingInfo.PaginationLinks.Add(lnk);
            }

            if (numberOfPagesRequired > dynamicDisplayCount)
            {
                //Set dots (ellipse) visibility
                pagingInfo.IsEndDotsVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsStartDotsVisible = firtsAddedLinkIndex <= 2 ? false : true;

                //First and Last Page Links
                pagingInfo.IsLastLinkVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsFirstLinkVisible = firtsAddedLinkIndex == 1 ? false : true;

            }

            pagingInfo.NumberOfPagesRequired = Convert.ToInt32(numberOfPagesRequired);

        }
        return pagingInfo;

    }
 }

MARK UPASPX Page

<form<%@ runat="server">
<inputPage type="hidden"Language="C#" runat="server"AutoEventWireup="true" id="hdSize"CodeBehind="LijosTest.aspx.cs" />Inherits="PagingTestWebApplication.LijosTest" %>
<div>
   <%@ <asp:GridViewRegister ID="gvPaging"TagPrefix="CP" runat="server"TagName="LijosPager" AutoGenerateColumns="false"Src="~/PagingUserControl.ascx" GridLines="None">%>
        <Columns>
     <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" <asp"http:TemplateField>
                <ItemTemplate>//www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                    <table>
                       <html <tr>xmlns="http://www.w3.org/1999/xhtml">
                            <td<head class="text">runat="server">
                                Emp ID:<title></title>
                           <style <type="text/td>css">
                            <td align="left" colspan="5">.page-numbers
                                <%# Eval("EmpID")%>{
                         border: 1px solid </td>#CCC;
                            <td align="left" colspan="4"color: class="text">#808185;
                                Namedisplay:
                            </td>block;
         float: left;
        font-size: 9pt;
        margin-right: <td>3px;
             padding: 4px 4px 3px;
        text-decoration: none;
    }
   <%# Eval("Name")%>
    .page-numbers.current
    {
        background-color: #808185;
        border: 1px solid </td>#808185;
              color: white;
        font-weight: </tr>bold;
           }
     
    .page-numbers.next, </table>.page-numbers.prev
     {
        border: 1px solid </ItemTemplate>white;
            </aspfont-size:TemplateField>
   12pt;
    }
 </Columns>style>
    </asp:GridView>head>
    <div class="fl"><body>
        <asp:Label<form runat="server"id="form1" ID="lblpre"></asp:Label>runat="server">
        <asp:Label runat="server"TextBox ID="lblIst"ID="txtEmpName" Visible="false"><runat="server"></asp:Label>TextBox>
        <asp:Label runat="server"Button ID="spDot1"ID="btnSearch" CssClass="page-numbersrunat="server" prev"Text="Button" Visible="false"ValidationGroup="Search"
           OnClick="btnSearch_Click" Text="..."></asp:Label>>
        <asp:PlaceHolder ID="pl" runat="server"></asp:PlaceHolder><div>
        <asp:Label runat="server" ID="spDot2" Visible="false"GridView CssClass="page-numbersID="grdEmployee" prev"runat="server">
            Text="..."><</asp:Label>GridView>
       </div>
 <asp<CP:LabelLijosPager runat="server"ID="uclPager" ID="lblLast"runat="server" Visible="false"></asp:Label>>
        <asp:LabelHiddenField runat="server"ID="hdnCurrentIndex" ID="lblnext"></asp:Label>
runat="server" Value="Blank Value" />
 </div>form>
 </div>body>
 </form>html>

CSSASPX Code Behind

public partial class LijosTest : System.page-numbersWeb.UI.Page
{

    private {int pageSize = 25;
    private int pageIndex = 1;

    border:protected 1pxvoid solidPage_Load(object #CCC;sender, EventArgs e)
    {
    color: #808185;   //Register event handler for user control event
        display:this.uclPager.PaginationLinkClicked block;+= new EventHandler(paginationLink_Click);

        float:if left;(Page.IsPostBack)
        font{
            //During all postbacks -size: 9pt;Add the pagination links to the page
        margin-right: 3px;   int tableDataCount = DatabaseSimulator.GetEmployeesCount(txtEmpName.Text);

        padding: 4px 4px 3px; string defaultInitialValueForHiddenControl = "Blank Value";
        text-decoration: none;   int indexFromPreviousDataRetrieval = 1;
            if (!String.Equals(hdnCurrentIndex.Value, defaultInitialValueForHiddenControl))
            {
                indexFromPreviousDataRetrieval = Convert.ToInt32(hdnCurrentIndex.Value, CultureInfo.InvariantCulture);
            }
            
            //Set property of user control
            uclPager.page-numbersPreviousIndex = indexFromPreviousDataRetrieval;

            //Call method in user control
            uclPager.currentPreAddAllLinks(tableDataCount, pageSize, indexFromPreviousDataRetrieval);
        }
        
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        background-color://When #808185;Search is clicked, reset the index to 1 (first page)
        border:pageIndex 1px= solid1;
 #808185;       BindBusinessProcessActivitiesData();
    }

    color:protected white;void paginationLink_Click(object sender, EventArgs e)
    {
    font-weight: bold;   //When link is clicked, set the pageIndex from user control property
        pageIndex = uclPager.CurrentClickedIndex;
        BindBusinessProcessActivitiesData();
    } 

    private void BindBusinessProcessActivitiesData()
    {

        string name = txtEmpName.page-numbersText; 
        List<Employee> searchResult = DatabaseSimulator.nextGetData(name, pageSize, pageIndex).pageToList();

        grdEmployee.DataSource = searchResult;
        grdEmployee.DataBind();

        //Index
        hdnCurrentIndex.Value = pageIndex.ToString(CultureInfo.InvariantCulture);

        //Get total number of records
        int tableDataCount = DatabaseSimulator.GetEmployeesCount(name);

        uclPager.AddPageLinks(tableDataCount, pageSize, pageIndex);

    }

   
}

Database Part

public static class DatabaseSimulator
{

    public static IEnumerable<Employee> GetData(string name, int pageSize,int index)
    {
        IEnumerable<Employee> employeesSource = SearchEmployees(name);
        int skipUpto = ((index-numbers1) * pageSize);

        IEnumerable<Employee> searchResult = employeesSource.prevSkip(skipUpto).Take(pageSize);
        return searchResult;

    }

    public static int GetEmployeesCount(string name)
    {
        border:List<Employee> 1pxemployees solid= white;GetEmployees();
        fontint employeesCount = 0;

        if (String.IsNullOrEmpty(name))
        {
            employeesCount = employees.Count;
        }
        else
        {
            List<Employee> selectedEmployees = employees.Where(r => r.Name == name).ToList();
            employeesCount =  selectedEmployees.Count;
        }

        return employeesCount;
    }

    private static IEnumerable<Employee> SearchEmployees(string name)
    {
        List<Employee> employees = GetEmployees();
        if (String.IsNullOrEmpty(name))
        {
            return employees;
        }

        return employees.Where(r => r.Name == name);
    }

    private static List<Employee> GetEmployees()
    {
        List<Employee> employees = new List<Employee>();
        
        for (int i = 1; i <= 400; i++)
        {
            Employee emp = new Employee();
            emp.EmpID = i;
            if (i % 2 == 0)
            {
                emp.Name = "Divisible by 2";
            }
            else if  (i % 3 == 0)
            {
                emp.Name = "Divisible by 3";
            }
            else if (i % 5 == 0)
            {
                emp.Name = "Divisible by 5";
            }
            else if (i % 7 == 0)
            {
                emp.Name = "Divisible by 7";
            }
            else 
            {
                emp.Name = "Other -size:- 12pt;"+ i.ToString();
            }

            employees.Add(emp);
        }

        return employees;
    }

}

public class Employee
{
    public int EmpID { get; set; }
    public string Name { get; set; }
}

QUESTIONS

Helper Class

namespace WebApplication1
{

public static class PagingHelper
{
    public static PagingInfo GetPageHyperlinks(int totalRecordsInTable, int pageSize, int currentIndex, string requestUrl)
    {

        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.LinksToAdd = new Collection<HyperLink>();

        string url = requestUrl;
        int position = requestUrl.IndexOf('?');
        if (position > 0)
        {
            url = requestUrl.Substring(0, position);
        }


        if (totalRecordsInTable > 0)
        {

            int itemsBeforeCurrentPage = 4;
            int itemsAfterCurrentPage = 2;
            int itemsCountInMiddleSection = itemsBeforeCurrentPage + 1 + itemsAfterCurrentPage;

            //string templates for links
            string link = "<a  href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers'>##Text##</span></a>";
            string link_pre = "<a href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers prev'>##Text##</span></a>";
            string link_next = "<a href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers next'>##Text##</span></a>";


            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            //Generate dynamic paging 
            int start;
            if (currentIndex <= (itemsBeforeCurrentPage + 1))
            {
                start = 1;
            }
            else
            {
                start = currentIndex - itemsBeforeCurrentPage;
            }

            int lastAddedLinkIndex = 0;
            int? firtsAddedLinkIndex = null;

            for (int i = start; i < start + itemsCountInMiddleSection; i++)
            {

                if (i > numberOfPagesRequired)
                {
                    //do not add more links if exceeded limit
                    continue;
                }

                //create dynamic HyperLinks 
                HyperLink lnk = new HyperLink();
                lnk.ID = "lnk_" + i.ToString();
                lnk.Text = i.ToString();
                lnk.Text = i.ToString();
                lastAddedLinkIndex = i;

                if (firtsAddedLinkIndex == null)
                {
                    firtsAddedLinkIndex = i;
                }


                //Check whetehr current page
                if (i == currentIndex)
                {
                    lnk.CssClass = "page-numbers current";
                }
                else
                {
                    lnk.CssClass = "page-numbers";
                    lnk.NavigateUrl = url + "?Index=" + i + "&Size=" + pageSize + "";
                }

                
                pagingInfo.LinksToAdd.Add(lnk);
            }


            if (numberOfPagesRequired > itemsCountInMiddleSection)
            {
                //Set dots (ellipse) visibility
                pagingInfo.IsEndDotsVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsStartDotsVisible = firtsAddedLinkIndex <= 2 ? false : true;

                //First and Last Page Links
                pagingInfo.IsLastLinkVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsFirstLinkVisible = firtsAddedLinkIndex == 1 ? false : true;

                pagingInfo.LastLinkText = link.Replace("[Index]", numberOfPagesRequired.ToString()).Replace("[Size]", pageSize.ToString()).Replace("##Text##", numberOfPagesRequired.ToString());
                pagingInfo.FirstLinkText = link.Replace("[Index]", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString()).Replace("[Size]", pageSize.ToString()).Replace("##Text##", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString());
            }


            //For first page, there is no previous
            if (currentIndex != 1)
            {
                pagingInfo.PreviousLinkText = link_pre.Replace("[Size]", pageSize.ToString()).Replace("[Index]", (currentIndex - 1).ToString()).Replace("##Text##", "Prev");
                
            }
            else
            {
                //Hyperlink is replaced with text
                pagingInfo.PreviousLinkText = "<span class='page-numbers prev'>Prev</span>";
            }


            //For last page there is no Next
            if (currentIndex != Convert.ToInt32(numberOfPagesRequired))
            {
                pagingInfo.NextLinkText = link_next.Replace("[Size]", pageSize.ToString()).Replace("[Index]", (currentIndex + 1).ToString()).Replace("##Text##", "Next");
                
            }
            else
            {
                //Hyperlink is replaced with text
                pagingInfo.NextLinkText = "<span class='page-numbers next'>Next</span>";
            }

        }
        return pagingInfo;
    }
}
}

Data Transfer Class

public class PagingInfo
{
    public Collection<HyperLink> LinksToAdd { get; set; }
    public bool? IsEndDotsVisible { get; set; }
    public bool? IsStartDotsVisible { get; set; }
    public bool? IsFirstLinkVisible { get; set; }
    public bool? IsLastLinkVisible { get; set; }
    public string FirstLinkText { get; set; }
    public string LastLinkText { get; set; }
    public string PreviousLinkText { get; set; }
    public string NextLinkText { get; set; }

}

Code Behind

namespace WebApplication1
{
public partial class Test : System.Web.UI.Page
{


    protected void Page_Load(object sender, EventArgs e)
    {
        int size = 0; int index = 0;

        if (!Page.IsPostBack)
        {
            

            string test =   this.Page.Request.Url.ToString();
            string sizeTest = Request["Size"];
            string indexTest = Request["Index"];

            size = string.IsNullOrEmpty(Request["Size"]) ? 5 : Convert.ToInt32(Request["Size"]);
            index = string.IsNullOrEmpty(Request["Index"]) ? 1 : Convert.ToInt32(Request["Index"]);


            //load data from database
            BindGrid(size, index);

        }
    }

    void BindGrid(int pageSize, int index)
    {

        try
        {

            string ConnStr = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";


            //the sql query with paging logics
            String SQL = @"select * from 
                        (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as row,*
                         FROM Employee) tblTemp
                         WHERE row between (" + index + " - 1) * " + pageSize + " + 1 and " + index + "*" + pageSize + " ";
                                              


            SQL += " select COUNT(*) from Employee";


            //fetching data from database suing SqlDataAdapter Fill method to bind the Gridview
            SqlDataAdapter ad = new SqlDataAdapter(SQL, ConnStr);
            DataSet ds = new DataSet();
            ad.Fill(ds);


            this.gvPaging.DataSource = ds.Tables[0];
            this.gvPaging.DataBind();

            DataTable tableForData = ds.Tables[0];
            DataTable tableForRowCount = ds.Tables[1];
            int totalRecordsInTable = Convert.ToInt32(tableForRowCount.Rows[0][0]);

           

            PagingInfo info = PagingHelper.GetPageHyperlinks(totalRecordsInTable, pageSize, index, this.Page.Request.Url.ToString());
            if(info.LinksToAdd!=null)
            {
                foreach (HyperLink link in info.LinksToAdd)
                {
                    this.pl.Controls.Add(link);
                }
            }

            //Dots visiblity
            if (info.IsEndDotsVisible != null)
            {
                spDot2.Visible = Convert.ToBoolean(info.IsEndDotsVisible);
            }
 
            if (info.IsStartDotsVisible != null)
            {
                spDot1.Visible = Convert.ToBoolean(info.IsStartDotsVisible);
            }
 
            //First and Last Links
            if (info.IsFirstLinkVisible != null)
            {
                lblIst.Visible = Convert.ToBoolean(info.IsFirstLinkVisible); 
                lblIst.Text = info.FirstLinkText;
            }
            if (info.IsLastLinkVisible != null)
            {
                lblLast.Visible = Convert.ToBoolean(info.IsLastLinkVisible); 
                lblLast.Text = info.LastLinkText;
            }

            //Pre and Next
            lblpre.Text = info.PreviousLinkText;
            lblnext.Text = info.NextLinkText;

           


        }
        catch (Exception ee)
        {
            //catch the exception
        }
    }

}

}

MARK UP

<form runat="server">
<input type="hidden" runat="server" id="hdSize" />
<div>
    <asp:GridView ID="gvPaging" runat="server" AutoGenerateColumns="false" GridLines="None">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <table>
                        <tr>
                            <td class="text">
                                Emp ID:
                            </td>
                            <td align="left" colspan="5">
                                <%# Eval("EmpID")%>
                            </td>
                            <td align="left" colspan="4" class="text">
                                Name:
                            </td>
                            <td>
                                <%# Eval("Name")%>
                            </td>
                        </tr>
                    </table>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <div class="fl">
        <asp:Label runat="server" ID="lblpre"></asp:Label>
        <asp:Label runat="server" ID="lblIst" Visible="false"></asp:Label>
        <asp:Label runat="server" ID="spDot1" CssClass="page-numbers prev" Visible="false"
            Text="..."></asp:Label>
        <asp:PlaceHolder ID="pl" runat="server"></asp:PlaceHolder>
        <asp:Label runat="server" ID="spDot2" Visible="false" CssClass="page-numbers prev"
            Text="..."></asp:Label>
        <asp:Label runat="server" ID="lblLast" Visible="false"></asp:Label>
        <asp:Label runat="server" ID="lblnext"></asp:Label>
    </div>
 </div>
 </form>

CSS

     .page-numbers
     {
        border: 1px solid #CCC;
        color: #808185;
        display: block;
        float: left;
        font-size: 9pt;
        margin-right: 3px;
        padding: 4px 4px 3px;
        text-decoration: none;
    }
    
    .page-numbers.current
    {
        background-color: #808185;
        border: 1px solid #808185;
        color: white;
        font-weight: bold;
    }
    
    .page-numbers.next, .page-numbers.prev
    {
        border: 1px solid white;
        font-size: 12pt;
    }

Points of interest

  1. It uses Link Buttons as suggested in http://stackoverflow.com/questions/14335067/passing-search-parameters-to-same-page-when-hyperlink-clicked
  2. The link buttons are added in Page_Load itself as listed in http://stackoverflow.com/questions/14364332/dynamic-controls-event-handlers-working
  3. It is made as user control for reuse

QUESTIONS

User Control Markup

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="PagingUserControl.ascx.cs"
Inherits="PagingTestWebApplication.PagingUserControl" %>
<div class="pagingSection" id="pagingSection" runat="server">
<asp:LinkButton ID="lnkPrevious" runat="server" CssClass='page-numbers prev' Visible="false" OnClick="LinkButton_Click">Prev</asp:LinkButton>
<asp:LinkButton ID="lnkFirst" runat="server" CssClass='page-numbers' Visible="false"
    OnClick="LinkButton_Click">1</asp:LinkButton>
<asp:Label runat="server" ID="lblFirstDots" CssClass="page-numbers prev" Visible="false"
    Text="..."></asp:Label>
<asp:PlaceHolder ID="plhDynamicLink" runat="server"></asp:PlaceHolder>
<asp:Label runat="server" ID="lblSecondDots" Visible="false" CssClass="page-numbers prev"
    Text="..."></asp:Label>
<asp:LinkButton ID="lnkLast" runat="server" CssClass='page-numbers' Visible="false"
    OnClick="LinkButton_Click">Last</asp:LinkButton>
<asp:LinkButton ID="lnkNext" runat="server" CssClass='page-numbers next' Visible="false" OnClick="LinkButton_Click">Next</asp:LinkButton>
 </div>

User Control Code Behind

public partial class PagingUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    public int PreviousIndex { get; set; }
    public int CurrentClickedIndex { get; set; } 

    public event EventHandler PaginationLinkClicked;

    protected void LinkButton_Click(object sender, EventArgs e)
    { 
        //Assumption: Text of the LinkButton will be same as index
        LinkButton clickedLinkButton = (LinkButton)sender;

        if (String.Equals(clickedLinkButton.Text, "Next"))
        {
            //Next Page index will be one greater than current
            //Note: If the current index is the last page, "Next" control will be in disabled state
            CurrentClickedIndex = PreviousIndex + 1;
        }
        else if (String.Equals(clickedLinkButton.Text, "Prev"))
        {
            //Previous Page index will be one less than current
            //Note: If the current index is the first page, "Prev" control will be in disabled state
            CurrentClickedIndex = PreviousIndex - 1;
        }
        else
        {
            CurrentClickedIndex = Convert.ToInt32(clickedLinkButton.Text, CultureInfo.InvariantCulture);
        }

        //Raise event
        if (this.PaginationLinkClicked != null)
        {
            this.PaginationLinkClicked(clickedLinkButton, e);
        } 

    }

    public void PreAddAllLinks(int tableDataCount,int pageSize,  int currentIndex)
    { 
        if (tableDataCount > 0)
        {
            PagingInfo info = PagingHelper.GetAllLinks(tableDataCount, pageSize, currentIndex);

            //Remove all controls from the placeholder
            plhDynamicLink.Controls.Clear();

            if (info.PaginationLinks != null)
            {
                foreach (LinkButton link in info.PaginationLinks)
                {
                    //Adding Event handler must be done inside Page_Laod /Page_Init
                    link.Click += new EventHandler(LinkButton_Click);

                    //Validation controls should be executed before link click.
                    link.ValidationGroup = "Search";
                    this.plhDynamicLink.Controls.Add(link);
                }
            }

        }
    }

    public void AddPageLinks(int tableDataCount, int pageSize, int index)
    {

        if (tableDataCount > 0)
        {
            pagingSection.Visible = true;
            PagingInfo info = PagingHelper.GetPageLinks(tableDataCount, pageSize, index);

            //Remove all controls from the placeholder
            plhDynamicLink.Controls.Clear();

            if (info.PaginationLinks != null)
            {
                lnkPrevious.Visible = info.PaginationLinks.Count > 0 ? true : false;
                lnkNext.Visible = info.PaginationLinks.Count > 0 ? true : false;

                foreach (LinkButton link in info.PaginationLinks)
                {
                    //Validation controls should be executed before link click.
                    link.ValidationGroup = "Search";
                    this.plhDynamicLink.Controls.Add(link);
                }
            }
            

            //Dots visiblity
            if (info.IsEndDotsVisible != null)
            {
                lblSecondDots.Visible = Convert.ToBoolean(info.IsEndDotsVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lblSecondDots.Visible = false;
            }

            if (info.IsStartDotsVisible != null)
            {
                lblFirstDots.Visible = Convert.ToBoolean(info.IsStartDotsVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lblFirstDots.Visible = false;
            }

            //First and Last Links
            if (info.IsFirstLinkVisible != null)
            {
                lnkFirst.Visible = Convert.ToBoolean(info.IsFirstLinkVisible, CultureInfo.InvariantCulture);
            }
            else
            {
                lnkFirst.Visible = false;
            }

            if (info.IsLastLinkVisible != null)
            { 
                lnkLast.Visible = Convert.ToBoolean(info.IsLastLinkVisible, CultureInfo.InvariantCulture);
                lnkLast.Text = info.NumberOfPagesRequired.ToString(CultureInfo.InvariantCulture);
            }
            else
            { 
                lnkLast.Visible = false;
            } 


            //For first page, there is no previous
            if (index != 1 && info.NumberOfPagesRequired != 1)
            { 
                lnkPrevious.Enabled = true;
            }
            else
            { 
                lnkPrevious.Enabled = false;
            } 


            //For last page there is no Next
            if (index != info.NumberOfPagesRequired && info.NumberOfPagesRequired != 1)
            { 
                lnkNext.Enabled = true;
            }
            else
            {
                lnkNext.Enabled = false;
            }
        }
        else
        {
            pagingSection.Visible = false;
        }

    }

 }

DTO

public class PagingInfo
{
    public Collection<LinkButton> PaginationLinks { get; set; }
    public bool? IsEndDotsVisible { get; set; }
    public bool? IsStartDotsVisible { get; set; }
    public bool? IsFirstLinkVisible { get; set; }
    public bool? IsLastLinkVisible { get; set; }
    public int NumberOfPagesRequired { get; set; }

}

Helper

public static class PagingHelper
{
    public static PagingInfo GetAllLinks(int totalRecordsInTable, int pageSize, int previousIndex)
    {
        
        string LinkButtonIDPrefix = "lnK";
        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.PaginationLinks = new Collection<LinkButton>();

        if (totalRecordsInTable > 0)
        {
            int itemsBeforePage = 4;
            int itemsAfterPage = 2;
            int dynamicDisplayCount = itemsBeforePage + 1 + itemsAfterPage;

            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            if (numberOfPagesRequired == 0)
            {
                numberOfPagesRequired = 1;
            }


            //Note: This function adds only the probable Links that the user can click (based on previous click).
            //This is needed sice dynamic controls need to be added while Page_Load itself for event handlers to work
            //In case of any bug, easiest way is add all links from 1 to numberOfPagesRequired
            //Following is an optimized way

            int endOfLeftPart = dynamicDisplayCount;
            //User may click "1". So the first 7 items may be required for display. Hence add them for event handler purpose
            for (int i = 1; i <= endOfLeftPart; i++)
            {
                //Create dynamic Links 
                LinkButton lnk = new LinkButton();
                lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                pagingInfo.PaginationLinks.Add(lnk);
            }


            int startOfRighPart = Convert.ToInt32(numberOfPagesRequired) - dynamicDisplayCount + 1;

            //User may click the last link. So the last 7 items may be required for display. Hence add them for event handler purpose
            for (int i = startOfRighPart; i <= Convert.ToInt32(numberOfPagesRequired); i++)
            {
                //Links already added should not be added again
                if (i > endOfLeftPart)
                {
                    //Create dynamic Links 
                    LinkButton lnk = new LinkButton();
                    lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                    lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                    pagingInfo.PaginationLinks.Add(lnk);
                }
            }

            //User may click on 4 items before current index as well as 2 items after current index
            for (int i = (previousIndex - itemsBeforePage); i <= (previousIndex + itemsAfterPage); i++)
            {
                //Links already added should not be added again
                if (i > endOfLeftPart && i < startOfRighPart)
                {
                    //Create dynamic Links 
                    LinkButton lnk = new LinkButton();
                    lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                    lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                    pagingInfo.PaginationLinks.Add(lnk);
                }
            }



        }
        return pagingInfo;
    }
    public static PagingInfo GetPageLinks(int totalRecordsInTable, int pageSize, int currentIndex)
    {
        string LinkButtonIDPrefix = "lnK";
        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.PaginationLinks = new Collection<LinkButton>();

        if (totalRecordsInTable > 0)
        {

            int itemsBeforePage = 4;
            int itemsAfterPage = 2;
            int dynamicDisplayCount = itemsBeforePage + 1 + itemsAfterPage;

            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            if (numberOfPagesRequired == 0)
            {
                numberOfPagesRequired = 1;
            }

            //Generate dynamic paging 
            int start;
            if (currentIndex <= (itemsBeforePage + 1))
            {
                start = 1;
            }
            else
            {
                start = currentIndex - itemsBeforePage;
            }

            int lastAddedLinkIndex = 0;
            int? firtsAddedLinkIndex = null;

            for (int i = start; i < start + dynamicDisplayCount; i++)
            {

                if (i > numberOfPagesRequired)
                {
                    break;
                }

                //Create dynamic Links 
                LinkButton lnk = new LinkButton();
                lnk.ID = LinkButtonIDPrefix + i.ToString(CultureInfo.InvariantCulture);
                lnk.Text = i.ToString(CultureInfo.InvariantCulture);
                lastAddedLinkIndex = i;

                if (firtsAddedLinkIndex == null)
                {
                    firtsAddedLinkIndex = i;
                }


                //Check whetehr current page
                if (i == currentIndex)
                {
                    lnk.CssClass = "page-numbers current";
                }
                else
                {
                    lnk.CssClass = "page-numbers";
                }

                pagingInfo.PaginationLinks.Add(lnk);
            }

            if (numberOfPagesRequired > dynamicDisplayCount)
            {
                //Set dots (ellipse) visibility
                pagingInfo.IsEndDotsVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsStartDotsVisible = firtsAddedLinkIndex <= 2 ? false : true;

                //First and Last Page Links
                pagingInfo.IsLastLinkVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsFirstLinkVisible = firtsAddedLinkIndex == 1 ? false : true;

            }

            pagingInfo.NumberOfPagesRequired = Convert.ToInt32(numberOfPagesRequired);

        }
        return pagingInfo;

    }
 }

ASPX Page

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LijosTest.aspx.cs" Inherits="PagingTestWebApplication.LijosTest" %>

<%@ Register TagPrefix="CP" TagName="LijosPager" Src="~/PagingUserControl.ascx" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 <html xmlns="http://www.w3.org/1999/xhtml">
 <head runat="server">
 <title></title>
 <style type="text/css">
    .page-numbers
    {
        border: 1px solid #CCC;
        color: #808185;
        display: block;
        float: left;
        font-size: 9pt;
        margin-right: 3px;
        padding: 4px 4px 3px;
        text-decoration: none;
    }
    
    .page-numbers.current
    {
        background-color: #808185;
        border: 1px solid #808185;
        color: white;
        font-weight: bold;
    }
     
    .page-numbers.next, .page-numbers.prev
    {
        border: 1px solid white;
        font-size: 12pt;
    }
 </style>
 </head>
 <body>
 <form id="form1" runat="server">
 <asp:TextBox ID="txtEmpName" runat="server"></asp:TextBox>
 <asp:Button ID="btnSearch" runat="server" Text="Button" ValidationGroup="Search"
    OnClick="btnSearch_Click" />
 <div>
    <asp:GridView ID="grdEmployee" runat="server">
    </asp:GridView>
 </div>
 <CP:LijosPager ID="uclPager" runat="server" />
 <asp:HiddenField ID="hdnCurrentIndex" runat="server" Value="Blank Value" />
 </form>
 </body>
 </html>

ASPX Code Behind

public partial class LijosTest : System.Web.UI.Page
{

    private int pageSize = 25;
    private int pageIndex = 1;

    protected void Page_Load(object sender, EventArgs e)
    {
        //Register event handler for user control event
        this.uclPager.PaginationLinkClicked += new EventHandler(paginationLink_Click);

        if (Page.IsPostBack)
        {
            //During all postbacks - Add the pagination links to the page
            int tableDataCount = DatabaseSimulator.GetEmployeesCount(txtEmpName.Text);

            string defaultInitialValueForHiddenControl = "Blank Value";
            int indexFromPreviousDataRetrieval = 1;
            if (!String.Equals(hdnCurrentIndex.Value, defaultInitialValueForHiddenControl))
            {
                indexFromPreviousDataRetrieval = Convert.ToInt32(hdnCurrentIndex.Value, CultureInfo.InvariantCulture);
            }
            
            //Set property of user control
            uclPager.PreviousIndex = indexFromPreviousDataRetrieval;

            //Call method in user control
            uclPager.PreAddAllLinks(tableDataCount, pageSize, indexFromPreviousDataRetrieval);
        }
        
    }

    protected void btnSearch_Click(object sender, EventArgs e)
    {
        //When Search is clicked, reset the index to 1 (first page)
        pageIndex = 1;
        BindBusinessProcessActivitiesData();
    }

    protected void paginationLink_Click(object sender, EventArgs e)
    {
        //When link is clicked, set the pageIndex from user control property
        pageIndex = uclPager.CurrentClickedIndex;
        BindBusinessProcessActivitiesData();
    } 

    private void BindBusinessProcessActivitiesData()
    {

        string name = txtEmpName.Text; 
        List<Employee> searchResult = DatabaseSimulator.GetData(name, pageSize, pageIndex).ToList();

        grdEmployee.DataSource = searchResult;
        grdEmployee.DataBind();

        //Index
        hdnCurrentIndex.Value = pageIndex.ToString(CultureInfo.InvariantCulture);

        //Get total number of records
        int tableDataCount = DatabaseSimulator.GetEmployeesCount(name);

        uclPager.AddPageLinks(tableDataCount, pageSize, pageIndex);

    }

   
}

Database Part

public static class DatabaseSimulator
{

    public static IEnumerable<Employee> GetData(string name, int pageSize,int index)
    {
        IEnumerable<Employee> employeesSource = SearchEmployees(name);
        int skipUpto = ((index-1) * pageSize);

        IEnumerable<Employee> searchResult = employeesSource.Skip(skipUpto).Take(pageSize);
        return searchResult;

    }

    public static int GetEmployeesCount(string name)
    {
        List<Employee> employees = GetEmployees();
        int employeesCount = 0;

        if (String.IsNullOrEmpty(name))
        {
            employeesCount = employees.Count;
        }
        else
        {
            List<Employee> selectedEmployees = employees.Where(r => r.Name == name).ToList();
            employeesCount =  selectedEmployees.Count;
        }

        return employeesCount;
    }

    private static IEnumerable<Employee> SearchEmployees(string name)
    {
        List<Employee> employees = GetEmployees();
        if (String.IsNullOrEmpty(name))
        {
            return employees;
        }

        return employees.Where(r => r.Name == name);
    }

    private static List<Employee> GetEmployees()
    {
        List<Employee> employees = new List<Employee>();
        
        for (int i = 1; i <= 400; i++)
        {
            Employee emp = new Employee();
            emp.EmpID = i;
            if (i % 2 == 0)
            {
                emp.Name = "Divisible by 2";
            }
            else if  (i % 3 == 0)
            {
                emp.Name = "Divisible by 3";
            }
            else if (i % 5 == 0)
            {
                emp.Name = "Divisible by 5";
            }
            else if (i % 7 == 0)
            {
                emp.Name = "Divisible by 7";
            }
            else 
            {
                emp.Name = "Other -- "+ i.ToString();
            }

            employees.Add(emp);
        }

        return employees;
    }

}

public class Employee
{
    public int EmpID { get; set; }
    public string Name { get; set; }
}
Source Link
LCJ
  • 333
  • 4
  • 15

Custom Paging in ASP.Net Web Application

I have following code for doing custom paging from an asp.net web application.

QUESTIONS

  1. Is there any pitfalls in this approach?
  2. Is there any improvement suggestions?

Helper Class

namespace WebApplication1
{

public static class PagingHelper
{
    public static PagingInfo GetPageHyperlinks(int totalRecordsInTable, int pageSize, int currentIndex, string requestUrl)
    {

        PagingInfo pagingInfo = new PagingInfo();
        pagingInfo.LinksToAdd = new Collection<HyperLink>();

        string url = requestUrl;
        int position = requestUrl.IndexOf('?');
        if (position > 0)
        {
            url = requestUrl.Substring(0, position);
        }


        if (totalRecordsInTable > 0)
        {

            int itemsBeforeCurrentPage = 4;
            int itemsAfterCurrentPage = 2;
            int itemsCountInMiddleSection = itemsBeforeCurrentPage + 1 + itemsAfterCurrentPage;

            //string templates for links
            string link = "<a  href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers'>##Text##</span></a>";
            string link_pre = "<a href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers prev'>##Text##</span></a>";
            string link_next = "<a href='" + url + "?Index=[Index]&amp;Size=[Size]'><span class='page-numbers next'>##Text##</span></a>";


            Double numberOfPagesRequired = Convert.ToDouble(totalRecordsInTable / pageSize);
            if (totalRecordsInTable % pageSize != 0)
            {
                numberOfPagesRequired = numberOfPagesRequired + 1;
            }

            //Generate dynamic paging 
            int start;
            if (currentIndex <= (itemsBeforeCurrentPage + 1))
            {
                start = 1;
            }
            else
            {
                start = currentIndex - itemsBeforeCurrentPage;
            }

            int lastAddedLinkIndex = 0;
            int? firtsAddedLinkIndex = null;

            for (int i = start; i < start + itemsCountInMiddleSection; i++)
            {

                if (i > numberOfPagesRequired)
                {
                    //do not add more links if exceeded limit
                    continue;
                }

                //create dynamic HyperLinks 
                HyperLink lnk = new HyperLink();
                lnk.ID = "lnk_" + i.ToString();
                lnk.Text = i.ToString();
                lnk.Text = i.ToString();
                lastAddedLinkIndex = i;

                if (firtsAddedLinkIndex == null)
                {
                    firtsAddedLinkIndex = i;
                }


                //Check whetehr current page
                if (i == currentIndex)
                {
                    lnk.CssClass = "page-numbers current";
                }
                else
                {
                    lnk.CssClass = "page-numbers";
                    lnk.NavigateUrl = url + "?Index=" + i + "&Size=" + pageSize + "";
                }

                
                pagingInfo.LinksToAdd.Add(lnk);
            }


            if (numberOfPagesRequired > itemsCountInMiddleSection)
            {
                //Set dots (ellipse) visibility
                pagingInfo.IsEndDotsVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsStartDotsVisible = firtsAddedLinkIndex <= 2 ? false : true;

                //First and Last Page Links
                pagingInfo.IsLastLinkVisible = lastAddedLinkIndex == numberOfPagesRequired ? false : true;
                pagingInfo.IsFirstLinkVisible = firtsAddedLinkIndex == 1 ? false : true;

                pagingInfo.LastLinkText = link.Replace("[Index]", numberOfPagesRequired.ToString()).Replace("[Size]", pageSize.ToString()).Replace("##Text##", numberOfPagesRequired.ToString());
                pagingInfo.FirstLinkText = link.Replace("[Index]", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString()).Replace("[Size]", pageSize.ToString()).Replace("##Text##", (numberOfPagesRequired - numberOfPagesRequired + 1).ToString());
            }


            //For first page, there is no previous
            if (currentIndex != 1)
            {
                pagingInfo.PreviousLinkText = link_pre.Replace("[Size]", pageSize.ToString()).Replace("[Index]", (currentIndex - 1).ToString()).Replace("##Text##", "Prev");
                
            }
            else
            {
                //Hyperlink is replaced with text
                pagingInfo.PreviousLinkText = "<span class='page-numbers prev'>Prev</span>";
            }


            //For last page there is no Next
            if (currentIndex != Convert.ToInt32(numberOfPagesRequired))
            {
                pagingInfo.NextLinkText = link_next.Replace("[Size]", pageSize.ToString()).Replace("[Index]", (currentIndex + 1).ToString()).Replace("##Text##", "Next");
                
            }
            else
            {
                //Hyperlink is replaced with text
                pagingInfo.NextLinkText = "<span class='page-numbers next'>Next</span>";
            }

        }
        return pagingInfo;
    }
}
}

Data Transfer Class

public class PagingInfo
{
    public Collection<HyperLink> LinksToAdd { get; set; }
    public bool? IsEndDotsVisible { get; set; }
    public bool? IsStartDotsVisible { get; set; }
    public bool? IsFirstLinkVisible { get; set; }
    public bool? IsLastLinkVisible { get; set; }
    public string FirstLinkText { get; set; }
    public string LastLinkText { get; set; }
    public string PreviousLinkText { get; set; }
    public string NextLinkText { get; set; }

}

Code Behind

namespace WebApplication1
{
public partial class Test : System.Web.UI.Page
{


    protected void Page_Load(object sender, EventArgs e)
    {
        int size = 0; int index = 0;

        if (!Page.IsPostBack)
        {
            

            string test =   this.Page.Request.Url.ToString();
            string sizeTest = Request["Size"];
            string indexTest = Request["Index"];

            size = string.IsNullOrEmpty(Request["Size"]) ? 5 : Convert.ToInt32(Request["Size"]);
            index = string.IsNullOrEmpty(Request["Index"]) ? 1 : Convert.ToInt32(Request["Index"]);


            //load data from database
            BindGrid(size, index);

        }
    }

    void BindGrid(int pageSize, int index)
    {

        try
        {

            string ConnStr = "Data Source=.;Initial Catalog=LibraryReservationSystem;Integrated Security=True;Connect Timeout=30";


            //the sql query with paging logics
            String SQL = @"select * from 
                        (SELECT  ROW_NUMBER() OVER (ORDER BY EmpID asc) as row,*
                         FROM Employee) tblTemp
                         WHERE row between (" + index + " - 1) * " + pageSize + " + 1 and " + index + "*" + pageSize + " ";
                                              


            SQL += " select COUNT(*) from Employee";


            //fetching data from database suing SqlDataAdapter Fill method to bind the Gridview
            SqlDataAdapter ad = new SqlDataAdapter(SQL, ConnStr);
            DataSet ds = new DataSet();
            ad.Fill(ds);


            this.gvPaging.DataSource = ds.Tables[0];
            this.gvPaging.DataBind();

            DataTable tableForData = ds.Tables[0];
            DataTable tableForRowCount = ds.Tables[1];
            int totalRecordsInTable = Convert.ToInt32(tableForRowCount.Rows[0][0]);

           

            PagingInfo info = PagingHelper.GetPageHyperlinks(totalRecordsInTable, pageSize, index, this.Page.Request.Url.ToString());
            if(info.LinksToAdd!=null)
            {
                foreach (HyperLink link in info.LinksToAdd)
                {
                    this.pl.Controls.Add(link);
                }
            }

            //Dots visiblity
            if (info.IsEndDotsVisible != null)
            {
                spDot2.Visible = Convert.ToBoolean(info.IsEndDotsVisible);
            }

            if (info.IsStartDotsVisible != null)
            {
                spDot1.Visible = Convert.ToBoolean(info.IsStartDotsVisible);
            }

            //First and Last Links
            if (info.IsFirstLinkVisible != null)
            {
                lblIst.Visible = Convert.ToBoolean(info.IsFirstLinkVisible); 
                lblIst.Text = info.FirstLinkText;
            }
            if (info.IsLastLinkVisible != null)
            {
                lblLast.Visible = Convert.ToBoolean(info.IsLastLinkVisible); 
                lblLast.Text = info.LastLinkText;
            }

            //Pre and Next
            lblpre.Text = info.PreviousLinkText;
            lblnext.Text = info.NextLinkText;

           


        }
        catch (Exception ee)
        {
            //catch the exception
        }
    }

}

}

MARK UP

<form runat="server">
<input type="hidden" runat="server" id="hdSize" />
<div>
    <asp:GridView ID="gvPaging" runat="server" AutoGenerateColumns="false" GridLines="None">
        <Columns>
            <asp:TemplateField>
                <ItemTemplate>
                    <table>
                        <tr>
                            <td class="text">
                                Emp ID:
                            </td>
                            <td align="left" colspan="5">
                                <%# Eval("EmpID")%>
                            </td>
                            <td align="left" colspan="4" class="text">
                                Name:
                            </td>
                            <td>
                                <%# Eval("Name")%>
                            </td>
                        </tr>
                    </table>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <div class="fl">
        <asp:Label runat="server" ID="lblpre"></asp:Label>
        <asp:Label runat="server" ID="lblIst" Visible="false"></asp:Label>
        <asp:Label runat="server" ID="spDot1" CssClass="page-numbers prev" Visible="false"
            Text="..."></asp:Label>
        <asp:PlaceHolder ID="pl" runat="server"></asp:PlaceHolder>
        <asp:Label runat="server" ID="spDot2" Visible="false" CssClass="page-numbers prev"
            Text="..."></asp:Label>
        <asp:Label runat="server" ID="lblLast" Visible="false"></asp:Label>
        <asp:Label runat="server" ID="lblnext"></asp:Label>
    </div>
 </div>
 </form>

CSS

     .page-numbers
     {
        border: 1px solid #CCC;
        color: #808185;
        display: block;
        float: left;
        font-size: 9pt;
        margin-right: 3px;
        padding: 4px 4px 3px;
        text-decoration: none;
    }
    
    .page-numbers.current
    {
        background-color: #808185;
        border: 1px solid #808185;
        color: white;
        font-weight: bold;
    }
    
    .page-numbers.next, .page-numbers.prev
    {
        border: 1px solid white;
        font-size: 12pt;
    }