Usuário com melhor resposta
Paginação com GridView direto do SQL Server

Pergunta
-
Pessoal, tenho um grid que exige carregamento muito rápido, porém, mesmo com todos os filtros ainda são retornados mais de 700 000 registros por consulta. Estou trabalhando com objetos, portanto tenho um método consultar que retorna uma lista com estes 700 000 objetos. Como já era de imaginar ficou inviável trabalhar dessa maneira devido a performance.
Resolvi fazer uma consulta paginada direto no sql server (utilizando WITH e RowNumber()), retornando apenas os 10 registros que serão apresentados, porém, para minha surpresa se eu não passar todos os registros para o gridview, eu não consegui paginar.
Consegui contornar o problema adicionando um dropdown e fazendo o carregamento de páginas manualmente (pego a qtd de registros total e divido pela quantidade por página, então, carrego dropdown de 1 até o número obtido arredondado sempre para cima) e o usuário altera a página pelo dropdown, porém, achei essa solução muito complexa de implementar.
Minha dúvida é se há alguma maneira mais simples de paginar os registros para um controle asp.Net (não precisa ser necessáriamente o gridview) sem trazer todos os registros do banco toda vez que trocar de página e sem armazenar esses registros na memória?
Abraços!
Respostas
-
Olá M Vargas,
É possivel sim passar um Objeto complexos para um ObjectDataSource, para isto basta você utilizar o evento Selecing do ObjectDataSource, veja:
protected void SeuObjectDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { SeuObjeto obj = new SeuObjeto(); obj.Valor = 1; e.InputParameters["nomeParametroObjeto"] = obj; }
Repare que eu tenho um Objeto (SeuObjeto) que pode ser uma classe criada por você, depois basta eu atribuir os respecitivos valores (neste exemplo defini que meu Objeto teria uma propriedade Valor), e depois passa o Objeto como parâmetro ao metodo através do e.InputParameters["nomeParametroObjeto"] , lembrando que o nomeParametroObjeto deve ser substituido pelo NOME do PARÂMETRO no metodo para o meu exemplo a declaração do parâmetro no metodo teria de estar algo parecido com:
public List SeuMetodo(SeuObjeto nomeParametroObjeto, int pageSize, int pageNumber) { //... }
Atenciosamente
Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli- Sugerido como Resposta Marcus Paulo Couto terça-feira, 30 de novembro de 2010 14:26
- Marcado como Resposta Eder CostaModerator segunda-feira, 10 de janeiro de 2011 18:09
Todas as Respostas
-
Olá M Vargas bom dia,
Bom, lendo seu post, pensei na verdade em uma solução de aplicação.
Vou explicar,
Entendo que esta trazaendo do Banco um quantidade de 70 000 registros e com isto ( Lógico ) , faz sua aplicação ou GridView Demorar muito para aparecer e também tem o problema da paginação.
Já pensou em colocar uma "Pesquisa"
Crie o WebForm e acrescente
Label
TextBox
Button
GridView
Este gridview use sem um datasource, o textbox e o button chamam o Parametro para uma pesquisa( método de busca) que preenche o Gridview somente com os registros pertinentes.
Não será uma solução melhor?
Espero ter ajudado, na dúvida em como criar me chama ok.
Se o post foi útil, marque como resposta, ok
Fernando Parmezani dos Reis
Programador C#, Asp.Net MVC.
fparmezani.wordpress
http://fparmezani.wordpress.com -
Olá M Vargas.
Uma das formas mais fácil para realizar esta paginação customizada no GridView é utilizando um ObjectDataSource, que ao ser definido como DataSource de um GridView passa de maneira praticamente implicita o número da página corrente do grid (PageNumber) e o número de registros para cada página (PageSize) a um metódo de negócio, este metodo de negócio por sua vez pode por exemplo passar estes valores recebidos como parâmetros para uma procedure.
Abaixo vai um exemplo completo de como fazer isto utilizando ObjectDataSource e GridView:
http://www.israelaece.com/post/Explorando-o-GridView-Paginacao-de-Dados.aspx
Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli- Sugerido como Resposta Dimie Lannes sexta-feira, 12 de novembro de 2010 18:02
-
Olá M Vargas.
Uma das formas mais fácil para realizar esta paginação customizada no GridView é utilizando um ObjectDataSource, que ao ser definido como DataSource de um GridView passa de maneira praticamente implicita o número da página corrente do grid (PageNumber) e o número de registros para cada página (PageSize) a um metódo de negócio, este metodo de negócio por sua vez pode por exemplo passar estes valores recebidos como parâmetros para uma procedure.
Abaixo vai um exemplo completo de como fazer isto utilizando ObjectDataSource e GridView:
http://www.israelaece.com/post/Explorando-o-GridView-Paginacao-de-Dados.aspx
Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli
O problema com o objectDataSource é passar os demais parâmetros de filtro. Está consulta precisa ser filtrada e eu passo 2 objetos além dos filtros e não consegui fazer isso com o objectDataSource.Você sabe se dá para fazer isso?
Abraços!
-
Olá M Vargas bom dia,
Bom, lendo seu post, pensei na verdade em uma solução de aplicação.
Vou explicar,
Entendo que esta trazaendo do Banco um quantidade de 70 000 registros e com isto ( Lógico ) , faz sua aplicação ou GridView Demorar muito para aparecer e também tem o problema da paginação.
Já pensou em colocar uma "Pesquisa"
Crie o WebForm e acrescente
Label
TextBox
Button
GridView
Este gridview use sem um datasource, o textbox e o button chamam o Parametro para uma pesquisa( método de busca) que preenche o Gridview somente com os registros pertinentes.
Não será uma solução melhor?
Espero ter ajudado, na dúvida em como criar me chama ok.
Se o post foi útil, marque como resposta, ok
Fernando Parmezani dos Reis
Programador C#, Asp.Net MVC.
fparmezani.wordpress
http://fparmezani.wordpress.com
Então Fernando. A consulta já é filtrada e não posso filtrar mais do isso por problemas de negócio.Abraço!
-
Olá M Vargas,
É possivel sim passar um Objeto complexos para um ObjectDataSource, para isto basta você utilizar o evento Selecing do ObjectDataSource, veja:
protected void SeuObjectDataSource_Selecting(object sender, ObjectDataSourceSelectingEventArgs e) { SeuObjeto obj = new SeuObjeto(); obj.Valor = 1; e.InputParameters["nomeParametroObjeto"] = obj; }
Repare que eu tenho um Objeto (SeuObjeto) que pode ser uma classe criada por você, depois basta eu atribuir os respecitivos valores (neste exemplo defini que meu Objeto teria uma propriedade Valor), e depois passa o Objeto como parâmetro ao metodo através do e.InputParameters["nomeParametroObjeto"] , lembrando que o nomeParametroObjeto deve ser substituido pelo NOME do PARÂMETRO no metodo para o meu exemplo a declaração do parâmetro no metodo teria de estar algo parecido com:
public List SeuMetodo(SeuObjeto nomeParametroObjeto, int pageSize, int pageNumber) { //... }
Atenciosamente
Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli- Sugerido como Resposta Marcus Paulo Couto terça-feira, 30 de novembro de 2010 14:26
- Marcado como Resposta Eder CostaModerator segunda-feira, 10 de janeiro de 2011 18:09
-
Olá,
Caso seu problema tenha sido resolvido, favor marcar como resposta os posts que lhe ajudaram a resolver o problema, pois isto facilita aos demais usuários do forúm a encontrarem as informações procuradas.
Caso ainda o problema ainda não tenha sido resolvido, você pode identificar o que não está dando certo para que possamos respondê-lo?
Obrigado
Se o post foi útil marque como resposta. - Advanced Web Application - MCP - Twitter: @mpghelli