Search code examples
c#asp.netgridviewpaginationwebforms

Paging in Gridview - The data source does not support server-side data paging


I´m trying to work with paging for my GridView but I get an error: "The data source does not support server-side data paging".

I do not understand what I'm doing wrong....

HTML (ASPX markup):

<asp:GridView ID="gwActivity" runat="server" AutoGenerateColumns="False" AllowPaging="True" OnRowCommand="gwActivity_RowCommand" CssClass="gwActivity" OnPageIndexChanging="gwActivity_PageIndexChanging">................[Plus more]

Code behind:

public void BindGridviewActivity()
{
    /*************Connectionstring is located in Web.config ******************/
    string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;

    using (SqlConnection con = new SqlConnection(CS))
    {
        SqlCommand cmd = new SqlCommand("SELECT T1.[ActivityID] FROM [BI_Planning].[dbo].[tlbActivity]", con);
        con.Open();
        gwActivity.DataSource = cmd.ExecuteReader();
        gwActivity.DataBind();
    }
}

Code behind (GridView):

protected void gwActivity_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
    gwActivity.PageIndex = e.NewPageIndex;
    BindGridviewActivity();

}

Solution

  • The exception most possibly come from this line:

    gwActivity.DataSource = cmd.ExecuteReader();
    

    AFAIK, SqlDataReader used by ExecuteReader() method can't be used to bind as GridView data source because it is forward-only reader and doesn't support paging feature. Use another data source like SqlDataAdapter which support bi-directional data reading as given below:

    public void BindGridviewActivity()
    {
        /*************Connectionstring is located in Web.config ******************/
        string CS = ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString;
    
        using (SqlConnection con = new SqlConnection(CS))
        {
            SqlCommand cmd = new SqlCommand("SELECT T1.[ActivityID] FROM [BI_Planning].[dbo].[tlbActivity]", con);
            con.Open();
    
            var da = new SqlDataAdapter(cmd);
            var ds = new DataSet();
            da.Fill(ds);
    
            if (ds.Tables.Count > 0)
            {
                gwActivity.DataSource = ds.Tables[0];
                gwActivity.DataBind();
            }
        }
    }