Paginação GridView
- Bom dia pessoal,
Estou preenchendo as GridViews do sistema através de uma Generic List de objetos. O preenchimento dos dados ocorre corretamente, mas a paginação não funciona. Alguém poderia me dizer como devo proceder?
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!
Todas as Respostas
Fale,
Olha esse link bem completo esse artigo:
http://www.linhadecodigo.com.br/Artigo.aspx?id=788
Abraço!
Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!- Ola André,
Segue alguns links que podem te ajudar:
Paginação Customizada no GridView
http://www.devmedia.com.br/articles/viewcomp.asp?comp=5671
Explorando o GridView
http://www.linhadecodigo.com.br/Artigo.aspx?id=788&pag=2
Personalizando a paginação no GridView
http://www.bufaloinfo.com.br/artigos/coluna37.asp
Atenciosamente
Se a resposta for útil marque como tal
Thiago Dorneles - Olá André
De uma olhada se seu problema não é o mesmo de outros daqui do forum
http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/802b8760-e0c6-4fc5-a65b-f2d286803378
http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/775771ec-b92b-4268-803b-93f34a59d415
Rudson Kiyoshi Souza Carvalho - Cara se vc está trabalhando com generics, vc vai ter que implementar algo parecido com isso
http://dotnetslackers.com/Community/blogs/simoneb/archive/2007/06/20/How-to-sort-a-generic-List_3C00_T_3E00_.aspx
Da uma procurada por sort generic list, eu já implementei um isso, vai dar um pouco de trabalho :). - Olá pessoal,
Obrigado pelas dicas, algumas eu poderei utilizar em outros projetos, mas acho que nenhuma delas vai resolver meu problema agora.
Não posso amarrar o método de carregamento a um datasource, pois preciso passar alguns parametros que são recuperados dinamicamente.
O problema é que quando clico em um link da paginação não acontece nada, a página atual permanece.
Já coloquei o seguinte código no PageIndexChanging, mas não resolveu:
gvLista.PageIndex = e.NewPageIndex; gvLista.DataBind();
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Se vc quer fazer assim, vc tem implementar no sorting algo parecido com isso
http://geekswithblogs.net/azamsharp/archive/2006/04/27/76612.aspx Fale,
Salva a fonte de dado no ViewState e na hora de paginar você faz dessa forma de acordo com a listagem 1:
Listagem 1:
gvLista.PageIndex = e.NewPageIndex;
gvLista.DataSource = (DataSet)ViewState["NomeViewState"];
gvLista.DataBind();
Abraço!
Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!- Olá Seilor,
Esta GridView que estou populando não terá a possibilidade de ordenação, somente paginação, que é onde estou tendo problemas.
Obrigado
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Desculpe me confundi para o paging faz o que o erysson postou no ultimo post que tem que dar certo,
1-vc setá o novo index, depois da bind com sua consulta, só cuidado que jogas um dataset na viewstate pode ficar meio pesada sua pagina :) - O único problema desse código que o Erysson postou é que não estou utilizando um dataset, estou utilizando uma generic list, seria possível utilizar o mesmo código com uma list?
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! Fale,
Salva a fonte de dado no ViewState e na hora de paginar você faz dessa forma de acordo com a listagem 1:
Listagem 1:
gvLista.PageIndex = e.NewPageIndex;
gvLista.DataSource = ViewState["NomeViewState"];
gvLista.DataBind();
Abraço!
Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!- Sim, é so salvar sua lista na viewstate :)
Faz uma propriedade, que fica mais bonito o código :)
public List<T> MyList
{
get
{
if (ViewState["MyList"] == null)
return new List<SeuObjeto>();
else
return (List<SeuObjeto>)ViewState["MyList"];
}
set
{
ViewState.Add("MyList", value);
}
} - Pessoal não adiantou, quando clico em outra página a atual continua permanecendo. Tá dificil!
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Posta o seu codigo da parte da paginação e o html da gridview
- Código para preencher a GridView (este código está no evento Page_Load):
Conteudo conteudo = new Conteudo(getString.ConnectionString); List<Conteudo> conteudos = conteudo.carregarConteudos(id_site, id, 0, 0, "titulo", 0, 'T', idioma); gvLista.DataSource = conteudos; gvLista.DataBind();
Código da paginação (atribui à GridView o evento OnPageIndexChanging="paginacao"):
protected void paginacao(object sender, GridViewPageEventArgs e) { gvLista.PageIndex = e.NewPageIndex; gvLista.DataBind(); }
Código da GridView:
<asp:GridView ID="gvLista" runat="server" DataKeyNames="ID" OnRowDataBound="preencherTabela" OnPageIndexChanging="paginacao" AutoGenerateColumns="False" AllowPaging="True" PageSize="5" EmptyDataText="Nenhum registro foi encontrado." Width="100%" GridLines="none" PagerSettings-Mode="NumericFirstLast" BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px" CellPadding="4" ForeColor="Black"> <Columns> <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="2%"> <ItemTemplate> <asp:Image ID="imgIcone" runat="server" /> </ItemTemplate> </asp:TemplateField> <asp:TemplateField ItemStyle-HorizontalAlign="Left" ItemStyle-Width="98%"> <ItemTemplate> <asp:HyperLink ID="hlTitulo" runat="server" /> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView>
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! VC tem que fazer igual está abaixo, salvar sua consulta na session ou viewstate e recuperar ela na paginação, ou vc pode refazer sua consulta igual
no exemplo 2
protected void paginacao(object sender, GridViewPageEventArgs e)
{
List<Conteudo> conteudos = recupere sua consulta da viewstate ou session
gvLista.PageIndex = e.NewPageIndex;
gvLista.DataSource = conteudos;
gvLista.DataBind();
}
2
protected void paginacao(object sender, GridViewPageEventArgs e)
{
Conteudo conteudo = new Conteudo(getString.ConnectionString);
List<Conteudo> conteudos = conteudo.carregarConteudos(id_site, id, 0, 0, "titulo" , 0, 'T' , idioma);
gvLista.PageIndex = e.NewPageIndex;
gvLista.DataSource = conteudos;
gvLista.DataBind();
}
- Olá Seilor, agora nem está executando o PostBack do link de paginação.
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Que estranho, pq era para funcionar, a sua grid vc carrega no pageload?
- Sim, estou carregando ela no Page_Load.
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Tenta assim
gvLista.DataSource = conteudos;
gvLista.DataBind();
gvLista.PageIndex = e.NewPageIndex;
Fale,
Na paginação tenta adaptar de acordo com a listagem 1:
Listagem 1
gvLista.PageIndex = e.NewPageIndex;
Conteudo conteudo = new Conteudo(getString.ConnectionString);
List<Conteudo> conteudos = conteudo.carregarConteudos(id_site, id, 0, 0, "titulo", 0, 'T', idioma);
gvLista.DataSource = conteudos;
gvLista.DataBind();
Abraço!
Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!- Também não funcionou
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Bom dia pessoal,
Resolvi mudar a maneira de carregar a Grid. Queria aproveitar o método que retornava a List, mas vi que está dando mais dor de cabeça do que criar um outro método que retorne um DataSet, por exemplo.
Alguém poderia me ajudar, dizendo como posso criar uma consulta que gere um dataset, a partir de uma consulta feita com stored procedure?
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! Fale,
Um pequeno exemplo mostra como criar a conexão com o BD Listagem 1 e a listagem 2 método que retorna o DataSet e a listagem 3 mostar como popular um gridview através do DataSet
Listagem 1:
SqlConnection dataConnection = new SqlConnection();
dataConnection.ConnectionString = "nome string conexão";
dataCommand.Connection = dataConnection;
dataCommand.CommandType = CommandType.StoredProcedure; //Colocar o comandType com a propriedade StoredProcedure
Listagem 2
public DataSet ExecuteDataSet()
{
SqlDataAdapter da = null;
DataSet ds = null;
try
{
da = new SqlDataAdapter();
da.SelectCommand = (SqlCommand)dataCommand;
ds = new DataSet();
da.Fill(ds);
}
catch (Exception ex)
{
if (handleErrors)
strLastError = ex.Message;
else
throw;
}
return ds;
}
Listagem 3
private void CarregaGrid()
{
DataSet ds = new DataSet();
BaseAccess db = new BaseAccess();
db.CommandText = "exec nome_procedure";
ds = db.ExecuteDataSet(db.CommandText);
gvProdutos.DataSource = ds;
gvProdutos.DataBind();
}
Abraço!
Se a resposta solucionar sua dúvida, favor - Votar como Útil Abraço!- Obrigado Erysson, vou implementar o código aqui e retorno para indicar se funcionou corretamente dessa vez.
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! - Rapaziada, só pode ser bruxaria!
Tentei de mais dois jeitos:
- DataSet
- ObjectDataSource
Porém continuou na mesma, quando clico em um link da paginação, a pagina atual é recarregada.
Agora estou preenchendo a GridView dessa forma:
HTML:
<asp:ObjectDataSource ID="dsLista" runat="server" OnObjectCreating="iniciar"></asp:ObjectDataSource> <asp:GridView ID="gvLista" runat="server" DataKeyNames="ID" DataSourceID="dsLista" OnRowDataBound="preencherTabela" OnPageIndexChanging="paginacao" AutoGenerateColumns="False" AllowPaging="True" PageSize="3" EmptyDataText="Nenhum registro foi encontrado." Width="100%" GridLines="None" BorderStyle="None" CellPadding="4" ShowHeader="False" PagerSettings-Mode="NumericFirstLast" PagerStyle-CssClass="paginacao" PagerSettings-FirstPageImageUrl="imagens/paginacaoAnterior.jpg" PagerSettings-LastPageImageUrl="imagens/paginacaoProximo.jpg" PagerSettings-PageButtonCount="1"> <PagerSettings FirstPageImageUrl="imagens/paginacaoAnterior.jpg" LastPageImageUrl="imagens/paginacaoProximo.jpg" Mode="NumericFirstLast" PageButtonCount="1" /> <Columns> <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="2%"> <ItemTemplate> <asp:Image ID="imgIcone" runat="server" /> </ItemTemplate> <ItemStyle HorizontalAlign="Center" Width="2%" /> </asp:TemplateField> <asp:TemplateField ItemStyle-HorizontalAlign="Left" ItemStyle-Width="98%"> <ItemTemplate> <asp:HyperLink ID="hlTitulo" runat="server" /> </ItemTemplate> <ItemStyle HorizontalAlign="Left" Width="98%" /> </asp:TemplateField> </Columns> <PagerStyle CssClass="paginacao" /> </asp:GridView>
Código:
dsLista.SelectMethod = "carregarConteudos"; dsLista.SelectParameters.Add("id_site", Convert.ToString(id_site)); dsLista.SelectParameters.Add("id_secao", Convert.ToString(id)); dsLista.SelectParameters.Add("id_tipo", "0"); dsLista.SelectParameters.Add("id_tipo_texto", "0"); dsLista.SelectParameters.Add("ordenar", "titulo"); dsLista.SelectParameters.Add("quantidade", "0"); dsLista.SelectParameters.Add("destaque", "T"); dsLista.SelectParameters.Add("idioma", idioma); dsLista.TypeName = "App_Sites.Conteudo.Conteudo"; dsLista.DataBind();
Está preenchendo corretamente, mas a paginação teima em não funcionar.
Não sei se é uma dúvida plausivel, mas poderia ser porque estou usando uma library para URL amigável?
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! Oi,
O databind deveria ser na grid e não no objectDataSource.
Tem algo que, se observei bem, você ainda não mostrou : Seu page_load. O erro que você descreveu estaria acontecendo se você houver colocado no page_load o código para carregar a grid sem fazer o teste do isPostBack.
De resto, a atribuição do newpageindex e o databind feito no evento pageindexchanged da gridview funcionaria, só falhando caso seu page_load tenha o problema acima.[]'s
Dennes
http://twitter.com/Dennes
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- EditadoHarley AraujoMSFT, Moderadorquinta-feira, 5 de novembro de 2009 11:42Conteúdo inadequado.
- Sugerido como RespostaHarley AraujoMSFT, Moderadorquinta-feira, 5 de novembro de 2009 11:42
- Olá Dennes,
Não postei o Page_Load aqui pois está um pouco extenso, mas o carregamento da GridView está dentro de um if (!IsPostBack) .
"De resto, a atribuição do newpageindex e o databind feito no evento pageindexchanged da gridview funcionaria, só falhando caso seu page_load tenha o problema acima."
O correto é usar o pageindexchanged ou o pageindexchanging ?
Grato
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos! Oi,
Desculpe, equivoco meu - changing
Se isso não funcionar, experimente uma depuração com breakpoints no pageindexchanging.
[]'s
Dennes
http://twitter.com/Dennes* Treinamento C# e Framework .NET c/OO dia 07/11 - Apenas 12 R$ 42,53 Inscreva-se em http://www.bufaloinfo.com.br/cursos/fundamentosOOFramework.asp
* Treinamento de ASP.NET 3.5 no RJ dia 16/11 - Apenas 12x R$ 60,48 - Inscreva-se em http://www.bufaloinfo.com.br/descontoaspnetantecipado.asp
Tel : (11) 3170-3056 (21)9240-5134 E-Mail: contato arroba bufaloinfo.com.br
http://www.bufaloinfo.com.br
Dennes - Se resolveu, classifique a mensagem, por favor - [http://www.bufaloinfo.com.br] NOVO DVD Segurança no ASP.NET : http://www.bufaloinfo.com.br/LearingSeriesSegurancaASPNET2.asp- Essa é outra página em que a paginação também não está funcionando.
Code behind:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // * Recupera a string de conexão armazenada no arquivo web.config ConnectionStringSettings getString = WebConfigurationManager.ConnectionStrings["conexao"] as ConnectionStringSettings; string palavras_chave = string.Empty; string idioma = string.Empty; if (Session["idioma"] != null) { idioma = Session["idioma"].ToString(); } // * Retorna as palavras chave buscadas if (!string.IsNullOrEmpty(Request.Form["txBusca"])) { palavras_chave = Request.Form["txBusca"].ToString(); } // * Informa as palavras buscadas pPalavrasChave.InnerHtml = "<strong>Palavra(s) informada(s): </strong>" + palavras_chave; if (!string.IsNullOrEmpty(palavras_chave)) { // * Inicia a classe Conteudo Conteudo conteudos = new Conteudo(getString.ConnectionString); // * Retorna os conteúdos a partir das palavras buscadas List<Conteudo> lista = conteudos.buscarConteudos(palavras_chave, idioma); // * Verifica se foi encontrado algum conteúdo if (lista.Count > 0) { // * Lista os conteúdos na GridView gvLista.DataSource = lista; gvLista.DataBind(); } else { pPalavrasChave.InnerHtml += "<br /><br />Não foi encontrado nenhum registro para as palavras pesquisadas."; gvLista.DataBind(); } } else { pPalavrasChave.InnerHtml += "<br /><br />É necessário informar algum dado para a pesquisa."; } } } // * Método para paginação protected void paginacao(object sender, GridViewPageEventArgs e) { gvLista.PageIndex = e.NewPageIndex; gvLista.DataBind(); }
HTML:
<asp:GridView ID="gvLista" runat="server" DataKeyNames="ID" OnRowDataBound="preencherTabela" OnPageIndexChanging="paginacao" AutoGenerateColumns="False" AllowPaging="True" PageSize="3" Width="100%" ShowHeader="false" GridLines="none" BorderStyle="None" CellPadding="4" PagerStyle-CssClass="paginacao" > <PagerSettings FirstPageImageUrl="~/imagens/paginacaoAnterior.jpg" LastPageImageUrl="~/imagens/paginacaoProximo.jpg" Mode="NumericFirstLast"> </PagerSettings> <Columns> <asp:TemplateField ItemStyle-HorizontalAlign="Center" ItemStyle-Width="2%"> <ItemTemplate> <asp:Image ID="imgIcone" runat="server" /> </ItemTemplate> <ItemStyle HorizontalAlign="Center" Width="2%"></ItemStyle> </asp:TemplateField> <asp:TemplateField ItemStyle-HorizontalAlign="Left" ItemStyle-Width="98%"> <ItemTemplate> <asp:HyperLink ID="hlTitulo" runat="server" /> </ItemTemplate> <ItemStyle HorizontalAlign="Left" Width="98%"></ItemStyle> </asp:TemplateField> </Columns> <PagerStyle CssClass="paginacao"></PagerStyle> </asp:GridView>
O que há de errado neste código????
André Luis. Vida de Desenvolvedor Web é assim mesmo... Cheia de hacks e baixos!

