SS113
SS113

Reputation: 548

Pagination of GridView in ASP.NET (Won't go to page 2,3, etc.)

I have a Gridview and I want to set Pagination. So far I have:

<asp:GridView ID="grdActivity" 
              runat="server" 
              AutoGenerateColumns="False"  
              AllowPaging="True" 
              PageSize="30"     
              OnPageIndexChanging="gridView_PageIndexChanging">

C# code on the back is:

protected void Page_Load(object sender, EventArgs e)
{
     if (!Page.IsPostBack)
     {
          dsActivity myDataSet = new dsActivity();

          myDataSet = clsDataLayer.GetActivity(Server.MapPath("DB.mdb"));

          grdActivity.DataSource = myDataSet.Tables["tblActivity"];

          grActivity.DataBind();
     }
}

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
     grdActivity.PageIndex = e.NewPageIndex;
     grdActivity.DataBind();
}

I get no errors but when I press any other page (2 and on), nothing shows, just a blank page and the GridView disappears. Am I missing something? I see hundreds of pages showing this exact code to do this.

Upvotes: 2

Views: 3562

Answers (3)

Lucian
Lucian

Reputation: 4001

You will need to re-assign your datasource property. After the postback the grActivity.DataSource is null, and calling DataBind on it will clear the grid.

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
     //re-assign your DataSource
     dsActivity myDataSet = new dsActivity();
     myDataSet = clsDataLayer.GetActivity(Server.MapPath("DB.mdb"));
     grdActivity.DataSource = myDataSet.Tables["tblActivity"];

     //Set the new page index
     grdActivity.PageIndex = e.NewPageIndex;

     //apply your changes
     grdActivity.DataBind();
}

Some notes:

  • you should consider re-factoring the code that brings you the data into a single method called on Page_Load and inside the gridview_PageIndexChanging (see @ekad's answer)

  • if you have a lot of data you should consider paging the data directly on the database. Right now if your table has 500 rows all will be loaded into the dataset even if just a small part of it (the page size) will be displayed in the grid

Upvotes: 2

Gurunadh
Gurunadh

Reputation: 463

Hi you please keep the code in a separate method and call it in page load event and page index changed event, something like

protected void FillGrid()
{          
    dsActivity myDataSet = new dsActivity();

    myDataSet = clsDataLayer.GetActivity(Server.MapPath("DB.mdb"));

    grdActivity.DataSource = myDataSet.Tables["tblActivity"];

    grActivity.DataBind();
}

and in the page index changing event

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
   grdActivity.PageIndex = e.NewPageIndex;

   FillGrid();    
}

and in page load in !post back event simply call the method, like

protected void Page_Load(object sender, EventArgs e)
{
  if (!Page.IsPostBack)
  {
     FillGrid();   
  }
}

Upvotes: 1

ekad
ekad

Reputation: 14614

You have to set the data source of grdActivity before calling grdActivity.DataBind() in gridView_PageIndexChanging method. I would also suggest creating a separate method to avoid repeating the same code in Page_Load and gridView_PageIndexChanging

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack)
    {
        grdActivity.DataSource = GetDataSource();
        grdActivity.DataBind();
    }
}

private DataTable GetDataSource()
{
    dsActivity myDataSet = new dsActivity();
    myDataSet = clsDataLayer.GetActivity(Server.MapPath("DB.mdb"));

    return myDataSet.Tables["tblActivity"];
}

protected void gridView_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    grdActivity.PageIndex = e.NewPageIndex;

    grdActivity.DataSource = GetDataSource();
    grdActivity.DataBind();
}

Upvotes: 1

Related Questions