none
Paginação com GridView direto do SQL Server RRS feed

  • 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!

    quinta-feira, 11 de novembro de 2010 10:49

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
    quinta-feira, 25 de novembro de 2010 16:41

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
    quinta-feira, 11 de novembro de 2010 11:26
  • 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
    quinta-feira, 11 de novembro de 2010 14:51
  • 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!

    quinta-feira, 18 de novembro de 2010 11:46
  • 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!

    quinta-feira, 18 de novembro de 2010 11:48
  • 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
    quinta-feira, 25 de novembro de 2010 16:41
  • 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
    segunda-feira, 29 de novembro de 2010 15:27