none
Problema com Paging num GridView que não utiliza DataSourceControl DataSource RRS feed

  • Pergunta

  • Ola a todos,

    estou trabalhando com uma filtragem de dados, onde tenho 1 RadioButtonList, 1 DropDownList e um GridView cuja propriedade "AutoGenerateColumns" é falsa.

    explicando a minha ideia básica do funcionamento:

    é uma pagina de procura que mostra resultados de (por exemplo: "linhas telefonicas") no grid. quando a página é carregada aparece alguns resultados no gridview, vindos de um SP criado para select. ok

    o rádio tem 3 campos, onde caso um deles for selecionado, o dropdownlist é preenchido dependendo do que necessito. ex: o radio tem serviço, ilha, e Localidade. caso serviço for selecionado o drop é prenchido com todas localidades pertencentes a essas linhas. esse preenchimento é feito através de SP. Já tenho todos os meus SP preparados e funcionando.

    Na radio tenho uma propriedade SelectedIndexChanged que é responsavel pela alteraçao da radio e chama a funçao que preenche o drop dependendo do que for selecionado. tá funcionando.

    tenho as funcoes responsáveis por selecionar as ilhas, serviços e localidades e disponibilizá-los na grid, através de DataBind.

    até aqui ta funcionando. O grande problema foi depois que implementei o meu pageChanging na GridView onde achei um codigo na net da seguinte forma:

    protected void GridViewResultadosProcLinha_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
            GridViewResultadosProcLinha.DataBind();

    }

    só qu no meu caso qualquer bind que acontecer no grid, deve ser levado em conta primeiro: verificar se o radio foi alterada, segundo verificar que item esta selecionado na dropdown e só depois efectuar a bind na grid. tenho implementada as funçoes responsavel pela aleracao do radioBtnList; funçao que Caso o DDLOpcoes for alterado, filtrar os dados conforme o que estiver selecionado e é controlado pelo radios

    Não sei como fazer com que este paging funciona e que continua tudo na filtragem como pretendido. Preciso de alguns esclarecimentos por favor. Aguardo

    quinta-feira, 14 de março de 2013 10:36

Todas as Respostas

  • Boa tarde,

    Sugiro que ao carregar o Grid o DataTable do mesmo seja armazenado em um ViewState, assim os dados que foram selecionados estarão em memória para que possa ser paginado. Segue exemplo:

    private void CarregarGrid() { DataTable dt = new DataTable(); dt.Rows.Add(new object[]{ 1 , "Funcionário 1", "func1@empresa.com.br" }); dt.Rows.Add(new object[] { 2, "Funcionário 2", "func2@empresa.com.br" }); dt.Rows.Add(new object[] { 3, "Funcionário 3", "func3@empresa.com.br" }); dt.Rows.Add(new object[] { 4, "Funcionário 4", "func4@empresa.com.br" }); dt.Rows.Add(new object[] { 5, "Funcionário 5", "func5@empresa.com.br" }); dt.Rows.Add(new object[] { 6, "Funcionário 6", "func6@empresa.com.br" }); dt.Rows.Add(new object[] { 7, "Funcionário 7", "func7@empresa.com.br" }); GridView1.DataSource = dt; GridView1.DataBind(); } protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) { //Seta a página selecionada GridView1.PageIndex = e.NewPageIndex;

    GridView1.DataBind(); }



    quinta-feira, 14 de março de 2013 17:24
  • Caro Eduardo, sobre paginação está funcionando da maneira que fiz e como eu não estou familiarizado com datatable, gostaria de não o utilizar ainda. mas a minha dúvida é que ao escolher um item no meu radio, é preenchido uns valores no meu dropdownlist, onde tenho 3 sources diferentes. depois ao escolher o item no drop, este valor é passado para um storedprocedure que é responsável por popular a minha grid. também tenho 3 SP diferentes, dependendo do valor escolhido na radiobutton (Servico, Localidade e Ilha). O funcionamento do meu codigo é o seguinte:

    1º escolho um item do radiobuttonlist. dependendo deste item é carregado o meu dropdownlist. tenho as 3 funçoes que carregam este drop.

    2º dentro deste drop, escolho um valor qualquer que é apresentado para que possa popular a gridview. e assim sucessivamente. 

    se mudar do item do radio é carregado o drop, com base neste item. e o valor selecionado no drop é que carrega a grid. esta grid é carregada através de 3 StoredProcedure diferentes que tomam 1 parametro, parametro este passado atraves do drop. 

    só que apartir do momento que implementei o evento para paginação da grid, preciso controlar também a mudança da drop. não sei se é possivel invocar um evento dentro de uma funçao, neste caso as minhas funçoes responsáveis por carregar a minha grid, funçoes estas invocadas através do evento do drop(SelectedIndexChanged). 

    Caso alguma explicaçao para melhor entendimento, é so dizer. preciso muito de uma ajuda. aguardo retorno

    sexta-feira, 15 de março de 2013 10:00
  • Mande o código completo da página para que possa te ajudar.

    Abraço.


    sexta-feira, 15 de março de 2013 19:34
  • Meu codigo completo da pagina de filtragem. espero que consigas me ajudar. aguardo Eduardo

    em Source:

    <asp:UpdatePanel ID="UpdatePanelLinha" runat="server"> <ContentTemplate> <table> <tr> <td style="padding-left: 5px"> Nro Linha: </td> <td style="padding-left: 5px"> <asp:TextBox ID="txtBProcuraLinha" runat="server" Width="140px"></asp:TextBox> </td> <td style="padding-left: 5px"> <asp:Button ID="btnProcurarLinha" runat="server" Text="Procurar" OnClick="btnProcurarLinha_Click" /> </td> </tr> </table> <br /> <table> <tr> <td> <asp:RadioButtonList ID="RadioBListFiltro" runat="server" AutoPostBack="True" CellSpacing="0" Height="22px" OnSelectedIndexChanged="RadioBListFiltro_SelectedIndexChanged" RepeatDirection="Horizontal" Width="300px"> <asp:ListItem>Ilha</asp:ListItem> <asp:ListItem>Serviço</asp:ListItem> <asp:ListItem>Localidade</asp:ListItem> </asp:RadioButtonList> </td> </tr> <tr> <td style="padding-top: 5px; text-align: left;"> <asp:DropDownList ID="DropDownListOpcoes" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownListOpcoes_SelectedIndexChanged"> </asp:DropDownList> </td> </tr> </table> <br /> <%--OnPageIndexChanging="GridViewResultadosProcLinha_PageIndexChanging" OnSorting="GridViewResultadosProcLinha_Sorting"--%> <asp:GridView ID="GridViewResultadosProcLinha" runat="server" CellPadding="4" ForeColor="#333333" GridLines="None" CellSpacing="1" AutoGenerateColumns="False" PageSize="2" OnSorting="GridViewResultadosProcLinha_Sorting" > <AlternatingRowStyle BackColor="White" ForeColor="#284775" /> <Columns> <asp:BoundField DataField="Nro_Linha" HeaderText="Nro. Linha" SortExpression="Nro_Linha" /> <asp:BoundField DataField="Nro_Associado" HeaderText="Nro.Associado" SortExpression="Nro_Associado" /> <asp:BoundField DataField="Data_Instalação" DataFormatString="{0:d}" HeaderText="Data Instalação" SortExpression="Data_Instalação" /> <asp:BoundField DataField="Data_Fim" DataFormatString="{0:d}" HeaderText="Data Fim" SortExpression="Data_Fim" /> <asp:BoundField DataField="Data_Inscrição" DataFormatString="{0:d}" HeaderText="Data Inscrição" SortExpression="Data_Inscrição" /> <asp:BoundField DataField="Observação" HeaderText="Observação" SortExpression="Observação" /> <asp:BoundField DataField="Serviço" HeaderText="Serviço" SortExpression="Serviço" /> <asp:BoundField DataField="Ilha" HeaderText="Ilha" SortExpression="Ilha" /> <asp:BoundField DataField="Concelho" HeaderText="Concelho" SortExpression="Concelho" /> <asp:BoundField DataField="Localidade" HeaderText="Localidade" SortExpression="Localidade" /> <asp:BoundField DataField="Zona" HeaderText="Zona" SortExpression="Zona" /> <asp:BoundField DataField="Colaborador" HeaderText="Colaborador" SortExpression="Colaborador" /> <asp:BoundField DataField="Estrutura" HeaderText="Estrutura" SortExpression="Estrutura" /> <asp:HyperLinkField DataNavigateUrlFields="nro_linha" DataNavigateUrlFormatString="~/EditarLinha.aspx?nro_linha={0}" Text="Editar" /> <asp:HyperLinkField DataNavigateUrlFields="id_linha" DataNavigateUrlFormatString="~/EliminarLinha.aspx?id_linha={0}" Text="Apagar" /> </Columns> <EditRowStyle BackColor="#999999" /> <FooterStyle BackColor="#5D7B9D" Font-Bold="True" ForeColor="White" /> <HeaderStyle BackColor="#fb6a01" Font-Bold="True" ForeColor="Black" /> <PagerSettings Mode="NumericFirstLast" /> <PagerStyle BackColor="#284775" ForeColor="White" HorizontalAlign="Center" /> <RowStyle BackColor="#F7F6F3" ForeColor="#333333" /> <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" /> <SortedAscendingCellStyle BackColor="#E9E7E2" /> <SortedAscendingHeaderStyle BackColor="#506C8C" /> <SortedDescendingCellStyle BackColor="#FFFDF8" /> <SortedDescendingHeaderStyle BackColor="#6F8DAE" /> </asp:GridView> </ContentTemplate> </asp:UpdatePanel>

     em code:

    //obter a string de conexao ja criada na web.con
        string enlCon = ConfigurationManager.ConnectionStrings["ConexaoENL-COMM"].ConnectionString;
    
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                FuncaoFiltroInicial();
                DropDownListOpcoes.Visible = false;
            }
            else
            {
                DropDownListOpcoes.Visible = true;
            }
    
        }
    
    
        /********FUNCOES IMPORTANTES PELAS FILTRAGENS*********/
    
        private void FuncaoSelecionarIlha()
        {
            SqlDataAdapter da = new SqlDataAdapter("ProcLinhaIlha", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            da.SelectCommand.Parameters.AddWithValue("@nome_ilha", DropDownListOpcoes.SelectedValue);
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
            GridViewResultadosProcLinha.DataSource = ds;
            GridViewResultadosProcLinha.DataBind();
        } /*Funcao responsavel pela filtragem das linhas pelas ilhas*/
    
        private void FuncaoSelecionarLocalidade()
        {
            SqlDataAdapter da = new SqlDataAdapter("ProcLinhaLocalidade", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.AddWithValue("@nome_localidade", DropDownListOpcoes.SelectedValue);
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
            GridViewResultadosProcLinha.DataSource = ds;
            GridViewResultadosProcLinha.DataBind();
        } /*Funcao responsavel pela filtragem das linhas pelas Localidades*/
    
        private void FuncaoSelecionarServico()
        {
            SqlDataAdapter da = new SqlDataAdapter("ProcLinhaServico", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
            da.SelectCommand.Parameters.AddWithValue("@nome_serv", DropDownListOpcoes.SelectedValue);
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
            GridViewResultadosProcLinha.DataSource = ds;
            GridViewResultadosProcLinha.DataBind();
        } /*Funcao responsavel pela filtragem das linhas pelos Servicos*/
    
        private void FuncaoFiltroInicial()
        {
            SqlDataAdapter da = new SqlDataAdapter("ProcuraLinhaInicial", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
            GridViewResultadosProcLinha.DataSource = ds;
            GridViewResultadosProcLinha.DataBind();
        } /*Funcao responsavel pela filtragem das linhas inicialmente*/
    
    
        /*************Filtro do DropDownList Opcoes**************/
    
        private void FiltroLocalidadeDDL()
        {
            SqlDataAdapter da = new SqlDataAdapter("FiltroLicalidade", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
    
            DropDownListOpcoes.DataTextField = "nome_localidade"; //nome do campo do seu select
            DropDownListOpcoes.DataValueField = "nome_localidade"; //nome do campo do seu select
            DropDownListOpcoes.DataSource = ds;
            DropDownListOpcoes.DataBind();
        }
    
        private void FiltroServicoDDL()
        {
            SqlDataAdapter da = new SqlDataAdapter("FiltroServico", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
    
            DropDownListOpcoes.DataTextField = "nome_serv"; //nome do campo do seu select
            DropDownListOpcoes.DataValueField = "nome_serv"; //nome do campo do seu select
            DropDownListOpcoes.DataSource = ds;
            DropDownListOpcoes.DataBind();
        }
    
        private void FiltroIlhaDDL()
        {
            SqlDataAdapter da = new SqlDataAdapter("FiltroIlha", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
    
            DropDownListOpcoes.DataTextField = "nome_ilha"; //nome do campo do seu select
            DropDownListOpcoes.DataValueField = "nome_ilha"; //nome do campo do seu select
            DropDownListOpcoes.DataSource = ds;
            DropDownListOpcoes.DataBind();
        }
    
    
        /*responsavel pela aleracao do radioBtnList*/
        protected void RadioBListFiltro_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RadioBListFiltro.Items[0].Selected == true)
            {
                FiltroIlhaDDL();
                FuncaoSelecionarIlha();
            }
    
            if (RadioBListFiltro.Items[1].Selected == true)
            {
                FiltroServicoDDL();
                FuncaoSelecionarServico();
            }
    
            if (RadioBListFiltro.Items[2].Selected == true)
            {
                FiltroLocalidadeDDL();
                FuncaoSelecionarLocalidade();
            }          
    
        } 
    
        /*Caso o DDLOpcoes for alterado, filtrar os dados conforme o que estiver selecionado. controlado pelo radios*/
        protected void DropDownListOpcoes_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (RadioBListFiltro.Items[0].Selected == true)
            {
                FuncaoSelecionarIlha();
            }
    
            if (RadioBListFiltro.Items[1].Selected == true)
            {
                FuncaoSelecionarServico();
            }
    
            if (RadioBListFiltro.Items[2].Selected == true)
            {
                FuncaoSelecionarLocalidade();
            }
        }
        
        /*Procura efectuada atraves do botao*/
        protected void btnProcurarLinha_Click(object sender, EventArgs e)
        {
            DropDownListOpcoes.Visible = false;
    
            SqlDataAdapter da = new SqlDataAdapter("ProcurarLinha", enlCon);
            //escolher o tipo de comando
            da.SelectCommand.CommandType = CommandType.StoredProcedure;
    
            da.SelectCommand.Parameters.AddWithValue("@nro_linha", txtBProcuraLinha.Text);
    
            //definir o objecto dadaset (ds)
            DataSet ds = new DataSet();
            //preencher os dados
            da.Fill(ds);
            GridViewResultadosProcLinha.DataSource = ds;
            GridViewResultadosProcLinha.DataBind();
        }
    
    
        /*funcoes responsaveis pelos eventos pageChanging e pageSorting*/
    
        private string ConvertSortDirectionToSql(SortDirection sortDirection)
        {
            string newSortDirection = String.Empty;
    
            switch (sortDirection)
            {
                case SortDirection.Ascending:
                    newSortDirection = "ASC";
                    break;
    
                case SortDirection.Descending:
                    newSortDirection = "DESC";
                    break;
            }
    
            return newSortDirection;
        }
    
        protected void GridViewResultadosProcLinha_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
            //GridViewResultadosProcLinha.DataBind();
            if (RadioBListFiltro.Items[0].Selected == true)
            {
                GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
                FuncaoSelecionarIlha();
    
                DropDownListOpcoes.Visible = true;
            }
    
            if (RadioBListFiltro.Items[1].Selected == true)
            {
                GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
                FuncaoSelecionarServico();
    
                DropDownListOpcoes.Visible = true;
            }
    
            if (RadioBListFiltro.Items[2].Selected == true)
            {
                GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
                FuncaoSelecionarLocalidade();
    
                DropDownListOpcoes.Visible = true;
            }
            else
            {
                GridViewResultadosProcLinha.PageIndex = e.NewPageIndex;
                FuncaoFiltroInicial();
                DropDownListOpcoes.Visible = false;
            }
        }
    
        protected void GridViewResultadosProcLinha_Sorting(object sender, GridViewSortEventArgs e)
        {
            DataTable dataTable  = GridViewResultadosProcLinha.DataSource as DataTable;
    
            if (dataTable != null)
            {
                DataView dataView = new DataView(dataTable);
                dataView.Sort = e.SortExpression + " " + ConvertSortDirectionToSql(e.SortDirection);
    
                GridViewResultadosProcLinha.DataSource = dataView;
                GridViewResultadosProcLinha.DataBind();
            }
        }

    sexta-feira, 15 de março de 2013 20:52
  • Sugiro que você estude ASP.NET, desde quando o ViewState fica na memória do Servidor ???

    ViewState é armazenado em um HiddenField com Base64, é uma forma de armazenamento no lado do Cliente, fora que jogar um coleção de registros no ViewState é uma péssima prática...


    Leonardo Lourenço Silva
    MCT, MCPD, MCTS, MCP

    Desligue a TV, tire sua fantasia de carnaval e vá ESTUDAR !!!

    sexta-feira, 15 de março de 2013 21:54
  • Desculpa Leonardo. tem 2 ultimos métodos que está no meu codigo mas não utilizo. foi ideias que vi em pesquisas na net. estou querendo implementar apenas o 

    protected void GridViewResultadosProcLinha_PageIndexChanging...

    desculpa por qualquer coisa, é que sou novo em asp e estou iniciando a pouco tempo os meus estudos profundos nele.

    sexta-feira, 15 de março de 2013 22:55
  • Desculpa Leonardo. tem 2 ultimos métodos que está no meu codigo mas não utilizo. foi ideias que vi em pesquisas na net. estou querendo implementar apenas o 

    protected void GridViewResultadosProcLinha_PageIndexChanging...

    desculpa por qualquer coisa, é que sou novo em asp e estou iniciando a pouco tempo os meus estudos profundos nele.

    Estava falando do Eduardo :)


    Leonardo Lourenço Silva
    MCT, MCPD, MCTS, MCP

    Desligue a TV, tire sua fantasia de carnaval e vá ESTUDAR !!!

    sexta-feira, 15 de março de 2013 23:14
  • :) mais uma vez desc Leandro. mas para salientar que não efectuei aquele exemplo, visto que não entendi bem e achei que no meu caso não seria necessário, visto que a minha duvida é outra. tem o codigo completo e agradeceria se alguem me pudesse ajudar a ultrapassar esta duvida.
    sexta-feira, 15 de março de 2013 23:33
  • E aí Flavio,

    Você está conseguindo realizar a paginação normalmente? Se sim, quando você pagina, os dados da página seguinte é a continuação da página anterior?

    Pelo que vi do seu código tudo era para estar funcionando, exceto pelo fato de que no código da página o GridView não está vinculado ao método GridViewResultadosProcLinha_Sorting.

    segunda-feira, 18 de março de 2013 12:45
  • Obrigado Leonardo, na verdade não tinha entendido bem a pergunta.
    segunda-feira, 18 de março de 2013 12:49