none
GridView com paginação e trocar da cor da linha RRS feed

  • Pergunta

  • Olá,

    Tenho um GridView com paginação, na primeira vez que ele carrega está tudo OK...


        protected void gvExtratoMensalidades_RowDataBound(object sender, GridViewRowEventArgs e)
        {

            //Mudando a cor das linhas do GridView, conforme a regra definida

            //Carrego um DataTable de todas as mensalidades...
           
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                if ( /* Regra para mudar a cor da linha */ )
                {
                    e.Row.BackColor = System.Drawing.Color.Pink;
                }
                else if ( /* Regra para mudar a cor da linha */ )
                {...

                  ...

                  ...

                 ....

                 }

             }

          }

     

                  
        protected void gvExtratoMensalidades_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            gvExtratoMensalidades.PageIndex = e.NewPageIndex;
            PreencheGridExtrato();
        }

     

    Mas quando no Gird, passo para segunda pagina, as linhas que trocaram de cor na primeira pagina contunuam, mesmo não atendendo as regras ...

    Tem como corrigir isso???

    Quando trocar de pagina as cores do Grid voltaram para o padrão???

     

    Obrigado!!!

    sexta-feira, 27 de agosto de 2010 14:25

Respostas

  • Leo,

     

    Fiz um exemplo simples de paginação e funcionou com DataSource , Databind, SqlDatasource e DataTable.

     

    Veja os códigos...

    Página Default:

    <body>
      <form id="form1" runat="server">
      <div>
        <asp:GridView ID="gvExemplo" runat="server" AllowPaging="True" 
          AutoGenerateColumns="False" DataKeyNames="Id" 
          onrowdatabound="gvExemplo_RowDataBound" 
          onpageindexchanging="gvExemplo_PageIndexChanging" PageSize="5">
          <Columns>
            <asp:BoundField DataField="Id" />
            <asp:BoundField DataField="Nome" />
            <asp:BoundField DataField="Cor" />
          </Columns>
        </asp:GridView>
      </div>
      </form>
    </body>
    

    protected void Page_Load(object sender, EventArgs e)
        {
            gvExemplo.DataSource = retornaDataTable();
            gvExemplo.DataBind();
          
        }
    
        protected void gvExemplo_RowDataBound(object sender, GridViewRowEventArgs e)
        {
          if(e.Row.RowType == DataControlRowType.DataRow)
          {
            string strCor = e.Row.Cells[2].Text;
    
            if(strCor.Trim() == "Azul")
            {
              e.Row.BackColor = System.Drawing.Color.Blue;
            }
            else
            {
              e.Row.BackColor = System.Drawing.Color.Red;
            }
          }
        }
        
        public DataTable retornaDataTable()
        {
          DataTable dt = new DataTable();
    
          dt.Columns.Add("id");
          dt.Columns.Add("Nome");
          dt.Columns.Add("Cor");
    
          DataRow dr = dt.NewRow();
    
          int i = 0;
          
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
          
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
          
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Amarelo";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          return dt;
    
        }
    
        protected void gvExemplo_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
          gvExemplo.PageIndex = e.NewPageIndex;
          gvExemplo.DataBind();
    
    
        }
    
      }
    


    http://fparmezani.wordpress.com
    • Sugerido como Resposta Fernando Parmezani segunda-feira, 30 de agosto de 2010 15:47
    • Marcado como Resposta leozincar terça-feira, 19 de outubro de 2010 11:10
    segunda-feira, 30 de agosto de 2010 15:46
  • leozincar..

     

     

    Leo,   pode ser isto mesmo, veja:

     

    a idèia é ...  carregar o Datatable >>  Verificar as Condições >> realizar a acão de cor..

    mas veja que o segredo pode estar no pageindechanging

     

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




    }

    se precisar chama,

     

     

     

    Caso a resposta te ajudou marque ncomo resposta, ok!!

     

    Abraços

     


    http://fparmezani.wordpress.com
    • Marcado como Resposta leozincar terça-feira, 19 de outubro de 2010 11:10
    quarta-feira, 8 de setembro de 2010 15:32

Todas as Respostas

  • Ola Amigo,

    tem certeza que esta mantendo as cores da pagina antiga mesmo? Pôs um breakpoint no RowDataBound para checar se não é ele que esta "pintando" as linhas erradas?

    sexta-feira, 27 de agosto de 2010 19:08
  • Tenho sim, ja coloquei o Breakpointo sim...

    Quando carrega a primeira vez, esta OK, quando seleciono um outra pagina ele passa pelo RowDataBound verifica a regra e não troca a cor de nenhuma linha...

    Ele esta mantendo as cores trocadas da primeira vez que carrega, as posições são as mesma...

    Alguem tem ideia do que esta acontecendo??? Como voltar para o padrao do Grid antes de verificar as regras em uma nova paginação???

    Obrigado!!!

    sexta-feira, 27 de agosto de 2010 19:32
  • Leo,

     

    Voce tem que verificar se na troca da pagina ele passa novamente pelo RowDataBound().

     

    Pelo que verifiquei voce faz o

    gvExtratoMensalidades.PageIndex = e.NewPageIndex;
    PreencheGridExtrato();

     

    Nos meus exemplos eu uso apenas um DataBind() na grid.

    gvExtratoMensalidades.PageIndex = e.NewPageIndex;

    gvExtratomensasildades.DataBind();

     

    Tenta...  quem sabe funciona!!

     

     

     


    http://fparmezani.wordpress.com
    sexta-feira, 27 de agosto de 2010 19:36
  • Tem sentido, pois o metodo "PreencheGridExtrato();" carrega todo o Grid novamente, e se eu nao me engano ele passa RowDataBound() pagina por pagina...

    Segunda vou tentar e posto aki no que deu...

    Valeu!!!

    sábado, 28 de agosto de 2010 12:35
  • Leo,

     

    Voce tem que verificar se na troca da pagina ele passa novamente pelo RowDataBound().

     

    Pelo que verifiquei voce faz o

    gvExtratoMensalidades.PageIndex = e.NewPageIndex;
    PreencheGridExtrato();

     

    Nos meus exemplos eu uso apenas um DataBind() na grid.

    gvExtratoMensalidades.PageIndex = e.NewPageIndex;

    gvExtratomensasildades.DataBind();

     

    Tenta...  quem sabe funciona!!

     

     

     


    http://fparmezani.wordpress.com


    Ola, Parmezani...

    Verifiquei todo meu código hoje cedo...

    No evento PageIndexChanging não funcionou apenas um Bind no Grid, assim ele não carrega. Tenho que chamar o método PreencheGridExtrato(); para ele carregar...

    Logo apos ele passa pelo evento RowDataBound() novamente, mas parece que ele somente verifica as regras da primeira página...

    Como fazer para passar a página que ele deve percorre para fazer as verificações das regras???

    segunda-feira, 30 de agosto de 2010 11:45
  • Oi Leo,

     

    Vou tentar azer um exemplo e te envio ok...

    qualquer coisa anota meu msn

     

    fparmezani@hotmail.com

     


    http://fparmezani.wordpress.com
    segunda-feira, 30 de agosto de 2010 15:15
  • Leo,

     

    Fiz um exemplo simples de paginação e funcionou com DataSource , Databind, SqlDatasource e DataTable.

     

    Veja os códigos...

    Página Default:

    <body>
      <form id="form1" runat="server">
      <div>
        <asp:GridView ID="gvExemplo" runat="server" AllowPaging="True" 
          AutoGenerateColumns="False" DataKeyNames="Id" 
          onrowdatabound="gvExemplo_RowDataBound" 
          onpageindexchanging="gvExemplo_PageIndexChanging" PageSize="5">
          <Columns>
            <asp:BoundField DataField="Id" />
            <asp:BoundField DataField="Nome" />
            <asp:BoundField DataField="Cor" />
          </Columns>
        </asp:GridView>
      </div>
      </form>
    </body>
    

    protected void Page_Load(object sender, EventArgs e)
        {
            gvExemplo.DataSource = retornaDataTable();
            gvExemplo.DataBind();
          
        }
    
        protected void gvExemplo_RowDataBound(object sender, GridViewRowEventArgs e)
        {
          if(e.Row.RowType == DataControlRowType.DataRow)
          {
            string strCor = e.Row.Cells[2].Text;
    
            if(strCor.Trim() == "Azul")
            {
              e.Row.BackColor = System.Drawing.Color.Blue;
            }
            else
            {
              e.Row.BackColor = System.Drawing.Color.Red;
            }
          }
        }
        
        public DataTable retornaDataTable()
        {
          DataTable dt = new DataTable();
    
          dt.Columns.Add("id");
          dt.Columns.Add("Nome");
          dt.Columns.Add("Cor");
    
          DataRow dr = dt.NewRow();
    
          int i = 0;
          
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
          
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
          
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Amarelo";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
    
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
    
          return dt;
    
        }
    
        protected void gvExemplo_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
          gvExemplo.PageIndex = e.NewPageIndex;
          gvExemplo.DataBind();
    
    
        }
    
      }
    


    http://fparmezani.wordpress.com
    • Sugerido como Resposta Fernando Parmezani segunda-feira, 30 de agosto de 2010 15:47
    • Marcado como Resposta leozincar terça-feira, 19 de outubro de 2010 11:10
    segunda-feira, 30 de agosto de 2010 15:46
  • Valeu, Parmezani...

    Acho que o meu código não está funcionando pq eu carrego um DataTable no início do método RowDataBound() e verifico as regras com ele (pois no Grid so carrego as informações necessárias para o usuário)  como não pagino o DataTable ele muda a cor do grid conforme a regra do inicio (primeira pag)...

    Deve ser isso, vou fazer alguns teste, se for... Como posso resolver???

    Alguem tem alguma idéia???

    quarta-feira, 8 de setembro de 2010 15:29
  • leozincar..

     

     

    Leo,   pode ser isto mesmo, veja:

     

    a idèia é ...  carregar o Datatable >>  Verificar as Condições >> realizar a acão de cor..

    mas veja que o segredo pode estar no pageindechanging

     

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




    }

    se precisar chama,

     

     

     

    Caso a resposta te ajudou marque ncomo resposta, ok!!

     

    Abraços

     


    http://fparmezani.wordpress.com
    • Marcado como Resposta leozincar terça-feira, 19 de outubro de 2010 11:10
    quarta-feira, 8 de setembro de 2010 15:32
  • Sem solução ainda, rs...

    Fiz todos os teste e realmente não está funcionando como eu preciso pq eu carrego e testo as condições com um DataTable...

    Para explicar melhor alterei o exemplo que o Parmezani envio (está da forma como eu estou fazendo, muda somento o evento  RowDataBound() ):

    Veja os códigos...

    Página Default:

     <body>
      <form id="form1" runat="server">
      <div>
        <asp:GridView ID="gvExemplo" runat="server" AllowPaging="True"
          AutoGenerateColumns="False" DataKeyNames="Id"
          onrowdatabound="gvExemplo_RowDataBound"
          onpageindexchanging="gvExemplo_PageIndexChanging" PageSize="5">
          <Columns>
            <asp:BoundField DataField="Id" />
            <asp:BoundField DataField="Nome" />
            <asp:BoundField DataField="Cor" />
          </Columns>
        </asp:GridView>
      </div>
      </form>
    </body>

     

     protected void Page_Load(object sender, EventArgs e)
        {
            gvExemplo.DataSource = retornaDataTable();
            gvExemplo.DataBind();      
        }

        protected void gvExemplo_RowDataBound(object sender, GridViewRowEventArgs e)
        {

           DataTable dtCondicao = retornaDataTable();

          if(e.Row.RowType == DataControlRowType.DataRow)
          {
            string strCor = e.Row.Cells[2].Text;

            if(dtCondicao.Rows[e.Row.RowIndex]["Cor"] == "Azul")     //if(strCor.Trim() == "Azul")

            {
              e.Row.BackColor = System.Drawing.Color.Blue;
            }
            else
            {
              e.Row.BackColor = System.Drawing.Color.Red;
            }
          }
        }
       
        public DataTable retornaDataTable()
        {
          DataTable dt = new DataTable();

          dt.Columns.Add("id");
          dt.Columns.Add("Nome");
          dt.Columns.Add("Cor");

          DataRow dr = dt.NewRow();

          int i = 0;
         
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);
         
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);
         
          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Amarelo";
          dt.Rows.Add(dr);

          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);

          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);

          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);

          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Azul";
          dt.Rows.Add(dr);

          i++;
          dr = dt.NewRow();
          dr["id"] = i.ToString();
          dr["Nome"] = "Fernando";
          dr["Cor"] = "Vermelho";
          dt.Rows.Add(dr);

          return dt;
        }

        protected void gvExemplo_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
          gvExemplo.PageIndex = e.NewPageIndex;
          gvExemplo.DataBind();
        }

      }

     

    Então tentei fazer como o expmlo do Parmezani, que esta funcionando perfeitamente, mas esbarrei em outros problemas...

    - Como não quero mostrar as linhas do GridView que verifico as condições, como fazer isso foi um problema...

    - Outro, do banco recebo valores nulos, porem quando

    string strCor = e.Row.Cells[2].Text;

    a variavel recebe "&nbsp;" e não null

    Tem como resolver isso???

     

    quinta-feira, 9 de setembro de 2010 17:59