Usuário com melhor resposta
Como paginar os dados corretamente em um GridView?

Pergunta
-
Olá pessoal.
Estou com dificuldade em paginar dados em um GridView usando o código abaixo.
{
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.
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 Snippetusing
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();
}
}
-
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
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 Snippetusing
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();
}
}
-
Olá!
ViewState, muito obrigado pela ajuda e pelo exemplo.
Criei o evento :
Code Snippetprotected 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 SnippetEnableSortingAndPagingCallbacks="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!
-
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.
-
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
-