Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles
(untagged)

Pagination with DataList

0.00/5 (No votes)
12 Sep 2012 1  
The most versatile control of ASP.NET, DataList, lacks one thing Pagination, built in.

Introduction

As we know, DataList is the most versatile Data Bound Control available in ASP.NET where you can display data as per your need in your required style, direction, etc. But there is some problem as well. There is no option to Paginate the Data Loaded in DataList directly. In case we have too many records, we cannot display all of them in one page without paginating. To escape from this situation, developers move to GridView, which has easy support for Paginating data.

Today, we will learn how to paginate DataList data in simple steps.

First create a DataList as per your requirement. I made one like below which is quite simple.

Let's place Next and Previous Buttons for navigation.

Design & Code

Code for the above design is shown below:

<div>
    
        <asp:DataList ID="DataList1" runat="server" 
        Height="194px" Width="174px" 
            oneditcommand="DataList1_EditCommand" 
            oncancelcommand="DataList1_CancelCommand" 
            onupdatecommand="DataList1_UpdateCommand" DataKeyField="eno">
            <HeaderTemplate>
              
              <table width="450" border="2">
                <tr>
                    <th>Employee Name </th>
                    <th>Designation </th>
                    <th>Salary </th>
                    <th>
                        Edit
                    </th>
                </tr>
               
            </HeaderTemplate> 
            <EditItemTemplate>
                <tr>
                    <td>
                        <asp:TextBox ID="txtEname" 
                        Text='<%#Eval("ename")%>' runat="server" />
                    </td>
                    <td>
                        <asp:TextBox ID="txtJOb" 
                        Text='<%#Eval("job")%>' runat="server" />
                    </td>
                    <td>
                        <asp:TextBox ID="txtSal" 
                        Text='<%#Eval("sal")%>' runat="server" />
                    </td>
                    <td>
                        <asp:LinkButton ID="lnk2" runat="server" 
                        Text="Update" CommandName ="Update" />
                    </td>
                    <td>
                        <asp:LinkButton ID="LinkButton1" 
                        runat="server" Text="Cancel"
                         CommandName ="Cancel" />
                    </td>               

                </tr>
            
            </EditItemTemplate> 

            <ItemTemplate>
                <tr>
                    <td><%#Eval("ename")%></td>
                    <td><%#Eval("job")%></td>
                    <td><%#Eval("sal")%></td>
                    <td>
                        <asp:LinkButton ID="lnk1" CommandName="Edit"  
                        Text="Edit !" runat="server" />
                    </td>
                </tr>
                
            </ItemTemplate> 
            
            <FooterTemplate>
              </table>
            </FooterTemplate> 
        </asp:DataList>
    
        <br />
    
    </div>
    <table class="style1">
        <tr>
            <td class="style2">
                <asp:LinkButton ID="LinkButton2" runat="server" 
                onclick="LinkButton2_Click">Next</asp:LinkButton>
            </td>
            <td>
                <asp:LinkButton ID="LinkButton3" runat="server" 
                onclick="LinkButton3_Click">Previous</asp:LinkButton>
            </td>
        </tr>
    </table> 

Now let's look at the backend.

ASPX.CS Page (Code Behind)

protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            CurrentPageIndex = 0;
            showData(); 
        }
    }
    int pg = 0;
    void showData()
    {
        PagedDataSource pgd = new PagedDataSource();
        SqlDataAdapter da = new SqlDataAdapter("select * from emp", 
        "Data Source=.\\SQLDB;Database=Test1;Integrated Security=True");
        DataSet ds = new DataSet();
        da.Fill(ds);

        pgd.DataSource = ds.Tables[0].DefaultView;
        pgd.CurrentPageIndex = CurrentPageIndex ;
        pgd.AllowPaging = true;
        pgd.PageSize = 5;

        LinkButton2.Enabled = !(pgd.IsLastPage);
        LinkButton3.Enabled = !(pgd.IsFirstPage);
  
 
        DataList1.DataSource = pgd;
        DataList1.DataBind();
    }

    protected void DataList1_EditCommand(object source, DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = e.Item.ItemIndex;
        showData(); 
    }
    protected void DataList1_CancelCommand(object source, DataListCommandEventArgs e)
    {
        DataList1.EditItemIndex = -1;
        showData(); 
    }
    protected void DataList1_UpdateCommand(object source, DataListCommandEventArgs e)
    {

    }

    public int CurrentPageIndex
    {
        get
        {
            if (ViewState["pg"] == null)
                return 0;
            else
                return Convert.ToInt16(ViewState["pg"]); 
        }
        set
        {
            ViewState["pg"] = value; 
        }
    } 

protected void LinkButton2_Click(object sender, EventArgs e)    {
        CurrentPageIndex++;
        showData();
    }
    protected void LinkButton3_Click(object sender, EventArgs e)
    {
        CurrentPageIndex--;
        showData();
    }

Now let me describe things that happened in the above code:

Move to showData() function.

We created a new object of PagedDataSource. Paged data source as the name stands clear, paginated data.Now we wrote Query, passed in Adapter, filled DataSet which should be all clear, because it was basic task in ADO.NET. Now we gave it CurrentPageIndex which means where is page now. For this, just look below to a class CurrentPageIndex which is returning value of CurentPageIndex =0 if page is being loaded. To check whether page is loaded or postback, we take the help of ViewState. If ViewState["pg"] == null, on Page load, this will be null because it is just being initiated. On Postback, it will pass the Int value stored in it to CurrentPageIndex.We set Pagination in PagedDataSource true and define page size of 5 records per page.Now pass PagedDataSource object as Datasource of Datalist.Now Linkbutton click events, we increased and decreased the value of CurrentPageIndex.

Hope this will be helpful to you. In case of any problem, please make correction in the code and help, feel free to comment below.

This tip has also been published here.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here