none
Como paginar os dados corretamente em um GridView? RRS feed

  • Pergunta

  • Olá pessoal.

     

    Estou com dificuldade em paginar dados em um GridView usando o código abaixo.

     

    protected void btnExibeGrid_Click(object sender, EventArgs e)

    {

    try

    {

    cn = new OleDbConnection(cnnStr);

    OleDbCommand cm = new OleDbCommand("Select cod, nome, dataNascimento " +

    "From cadastro",cn);

    OleDbDataAdapter da = new OleDbDataAdapter(cm);

    DataSet ds = new DataSet();

    da.Fill(ds);

    GridView1.DataSource = ds;

    GridView1.DataBind();

    }

    catch (Exception ex)

    {

    lblErro.Text = ex.Message;

    }

    finally

    {

    cn.Close();

    }

    }

     

    Usando ObjectDataSource e SqlDataSource com o mesmo GridBiew consigo fazer a paginação sem problemas.

     

    Para ficar mais fácil a compreensão do problema, criei um exemplo e disponibilizei no link abaixo:

     

    http://dorodev.pessoal.ws/PagingGridView/

     

    Clicando no button os dados são exibidos e no rodapé da página os links para navegar nos registros. O problema ocorre quando clico em desses links (1 2 3), simplesmente os registros da próxima página não aparecem, porém, se eu fizer o refresh da página  ou até mesmo clicar no Botton novamente os dados aparecem.

     

    Como o mesmo GridView funciona  utilizando ObjectDataSource, acredito que o problema está na forma que estou populando os dados (meu código).

     

    Vocês tem alguma dica?

     

    Obrigado.

     

    domingo, 24 de fevereiro de 2008 18:39

Respostas

  • Grande

     

    Segue um exemplo funcional

     

    A pagina:

    Code Snippet

     

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default13.aspx.cs" Inherits="Default13" %>

    <!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>Untitled Page</title>

    </head>

    <body>

    <form id="form1" runat="server">

    <div>

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging"

    Style="position: relative">

    </asp:GridView>

    </div>

    </form>

    </body>

    </html>

     

     

     

    O Codigo:

     

    Code Snippet

    using System;

    using System.Data;

    using System.Configuration;

    using System.Collections;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using System.Data.SqlClient;

    public partial class Default13 : System.Web.UI.Page

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    if (!Page.IsPostBack)

    {

    SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=ECS379\\SQLEXPRESS");

    SqlCommand command = new SqlCommand("Select * from Customers", conn);

    SqlDataAdapter da = new SqlDataAdapter(command);

    DataSet ds = new DataSet();

    da.Fill(ds);

    GridView1.DataSource = ds;

    GridView1.DataBind();

    }

    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

    {

    GridView1.PageIndex = e.NewPageIndex;

    SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=ECS379\\SQLEXPRESS");

    SqlCommand command = new SqlCommand("Select * from Customers", conn);

    SqlDataAdapter da = new SqlDataAdapter(command);

    DataSet ds = new DataSet();

    da.Fill(ds);

    GridView1.DataSource = ds;

    GridView1.DataBind();

    }

    }

     

     

     

    segunda-feira, 25 de fevereiro de 2008 17:17
    Moderador
  •  

    Grande existem varias formas de resolver esse problema, você poderia usar um DataLayer, ou Caching por exemplo.

     

    De um olhada nesses links

     

    http://aspnet.4guysfromrolla.com/articles/031506-1.aspx

     

    http://msdn2.microsoft.com/en-us/library/z56y8ksb.aspx

     

    http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx

    quarta-feira, 27 de fevereiro de 2008 16:26
    Moderador

Todas as Respostas

  • Grande

     

    Segue um exemplo funcional

     

    A pagina:

    Code Snippet

     

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default13.aspx.cs" Inherits="Default13" %>

    <!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>Untitled Page</title>

    </head>

    <body>

    <form id="form1" runat="server">

    <div>

    <asp:GridView ID="GridView1" runat="server" AllowPaging="True" OnPageIndexChanging="GridView1_PageIndexChanging"

    Style="position: relative">

    </asp:GridView>

    </div>

    </form>

    </body>

    </html>

     

     

     

    O Codigo:

     

    Code Snippet

    using System;

    using System.Data;

    using System.Configuration;

    using System.Collections;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using System.Data.SqlClient;

    public partial class Default13 : System.Web.UI.Page

    {

    protected void Page_Load(object sender, EventArgs e)

    {

    if (!Page.IsPostBack)

    {

    SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=ECS379\\SQLEXPRESS");

    SqlCommand command = new SqlCommand("Select * from Customers", conn);

    SqlDataAdapter da = new SqlDataAdapter(command);

    DataSet ds = new DataSet();

    da.Fill(ds);

    GridView1.DataSource = ds;

    GridView1.DataBind();

    }

    }

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

    {

    GridView1.PageIndex = e.NewPageIndex;

    SqlConnection conn = new SqlConnection("Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Data Source=ECS379\\SQLEXPRESS");

    SqlCommand command = new SqlCommand("Select * from Customers", conn);

    SqlDataAdapter da = new SqlDataAdapter(command);

    DataSet ds = new DataSet();

    da.Fill(ds);

    GridView1.DataSource = ds;

    GridView1.DataBind();

    }

    }

     

     

     

    segunda-feira, 25 de fevereiro de 2008 17:17
    Moderador
  •  

    Olá!

     

     ViewState, muito obrigado pela ajuda e pelo exemplo.

     

    Criei o evento :

     

    Code Snippet

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            try
            {
                cn = new OleDbConnection(cnnStr);
                OleDbCommand cm = new OleDbCommand("Select cod, nome, dataNascimento " +
                                                    "From cadastro", cn);
                OleDbDataAdapter da = new OleDbDataAdapter(cm);
                DataSet ds = new DataSet();
                da.Fill(ds);
                GridView1.DataSource = ds;
                GridView1.DataBind();
            }
            catch (Exception ex)
            {
                lblErro.Text = ex.Message;
            }
            finally
            {
                cn.Close();
            }
        }

     

     

    E desabilitei o:

     

    Code Snippet

    EnableSortingAndPagingCallbacks="false"

     

     

    Resolveu o problema da paginação http://dorodev.pessoal.ws/PagingGridView_2

    mas isso gerou mais consultas na base de dados, como os dados já estão no dataset eu gostaria de reutiliza-los na paginação.

     

    Alguém sabe como posse fazer isso?

     

    Abraço!

     

    terça-feira, 26 de fevereiro de 2008 13:55
  • Sempre que você troca de página do GridView você tem que fornecer novamente a fonte de dados (DataSource) e efetuar um DataBind() no controle, depois que os dados são renderizados o restante que está no DataSource é perdido. Então para que não tenha que ir novamente ao banco de dados so mesmo persistindo a fonte de dados em sessão, cachê, view state etc.

     

    terça-feira, 26 de fevereiro de 2008 18:15
  •  

    Grande existem varias formas de resolver esse problema, você poderia usar um DataLayer, ou Caching por exemplo.

     

    De um olhada nesses links

     

    http://aspnet.4guysfromrolla.com/articles/031506-1.aspx

     

    http://msdn2.microsoft.com/en-us/library/z56y8ksb.aspx

     

    http://weblogs.asp.net/scottgu/archive/2006/01/01/434314.aspx

    quarta-feira, 27 de fevereiro de 2008 16:26
    Moderador
  • Boa tarde.

     

    Dúvidas esclarecidas.

     

    Obrigado.

     

    quinta-feira, 28 de fevereiro de 2008 18:25