none
Dúvida com DataGridView_CellFormatting RRS feed

  • Pergunta

  • Olá pessoal, nessa rotina, gero um DataGrid com cores com sim, cor não, mas se eu gravar a coluna Status como "A" em uma determinada linha, todas as outras linhas do DataGrid, ficam verdes também, como faço para manter as linhas com as cores como estão, mas somente as linhas com status = "A", ficarem verdes ?

     private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
      if (this.dataGridView1.Columns[e.ColumnIndex].Name == "status") 
      {
      if (e.Value.ToString() == "A")
       {
           DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
           row.DefaultCellStyle.BackColor = Color.Green;
       }
     }

    windows Form, C#

    sexta-feira, 1 de dezembro de 2017 15:27

Respostas

  • Podes fazer tua cor alternada e a cor para o valor "A" no mesmo lugar. No caso, tenho um DataGridView chamado Grid e vou aplicar duas cores alternadas, mas quando o valor de status for "A", a cor será verde.

            private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {           
                var row = Grid.Rows[e.RowIndex];
                var ativo = Grid.Rows[e.RowIndex].Cells["status"].Value.ToString();
                row.DefaultCellStyle.BackColor = (e.RowIndex + 2)%2 == 0 ? Color.CornflowerBlue : Color.BurlyWood;
    
                if (ativo == "a")
                row.DefaultCellStyle.BackColor = Color.Green;          
            }


    Caso tenha problemas com o flickering, aquela piscada nos valores da Grid, cria uma classe com este conteúdo:

    public static class DataGridViewExtensioncs
        {
            public static void DoubleBuffered(this DataGridView dgv, bool setting)
            {
                var dgvType = dgv.GetType();
                var pi = dgvType.GetProperty("DoubleBuffered",
                    BindingFlags.Instance | BindingFlags.NonPublic);
                pi?.SetValue(dgv, setting, null);
            }
        }

    E aplica na tua Grid na inicialização dos componentes:

    Grid.DoubleBuffered(true);

    Att,


    Antero Marques
    ______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.


    Olá Antero tudo bem?!

    Antero com esse código irá até funcionar porém irá criar uma redundância infinita na aplicação, fazendo um loop de alocação de CPU/Memória.

    Se executar e já trazer formatado isso funcionar perfeito, mais se aplicar uma alteração no grid, entra a redundância de formatação.

    Minha sugestão seria usar uma função a parte pra isso:

    Fiz uma função usando parte de seu código como exemplo, acredito que com isso podemos ajudar nosso amigo Porter.

     private void FormatarGrid(DataGridView dataGridView)
            {
                if(dataGridView.DataSource != null && dataGridView.Rows.Count>0)
                {
    
                    for (int i = 0; i < dataGridView.Rows.Count; i++)
                    {
                        var row = dataGridView.Rows[i];
                        if(!row.IsNewRow)
                        {
                            var ativo = dataGridView[1, i].Value.ToString();
                            row.DefaultCellStyle.BackColor = i % 2 == 0 ? Color.CornflowerBlue : Color.BurlyWood;
    
                            if (ativo == "2")
                            {
                                Console.WriteLine(i);
                                row.DefaultCellStyle.BackColor = Color.Green;
                            }
                        } 
                    }
                }
            }

    E faria a chamada após carregar/alterar o grid!

    Ex: FormatarGrid(seuGrid);


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Senior Developer C#
    Development Leader at JAMSOFT Informática
    Microsoft Certified Professional
    Criador e Mantenedor do EntityFramework Core for Firebird
    Contribuidor do EntityFramework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter


    sexta-feira, 1 de dezembro de 2017 23:27

Todas as Respostas

  • Olá Porter,

    Você está forcando isso com o código:

    e.Value.ToString() == "A"

    para resolver isso voccê pode fazer essa pequena mudança em seu código:

    private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
      if (this.dataGridView1.Columns[e.ColumnIndex].Name == "status" && e.Value.ToString() == "A") 
      {
         DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
         row.DefaultCellStyle.BackColor = Color.Green;
     }


     


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Senior Developer C#
    Development Leader at JAMSOFT Informática
    Microsoft Certified Professional
    Criador e Mantenedor do EntityFramework Core for Firebird
    Contribuidor do EntityFramework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sexta-feira, 1 de dezembro de 2017 16:47
  • Olá Rafael,

    Não deu certo, o comportamento é o mesmo fazendo da forma que você sugeriu, se alterar o status para STATUS="A" na primeira linha do DataGridView, o restante do DataGridView fica tudo BackColor = Green, se mudar o Status para "A" da segunda linha em diante no DataGridView, funciona corretamente, acho que teria que acrescentar mais uma linha para o caso do STATUS != "A", o DataGrid ficar como cor sim cor não, mas não sei se tem como fazer isso via código.

    Obrigado.

    Windows Form, C#.

    sexta-feira, 1 de dezembro de 2017 18:43
  • Pode toma-la como Inconsiderada, estava almoçando era pra mostrar um código mais legível. e não tomei o cuidado de avisar isso!

    Minha consideração era que:

        Seu DataGridView já estava fazendo a intercalação de cores, Com base na validação do nome da coluna (status) e com valor (A).

    Então tinha deduzido que a intercalação já existia, e que precisa apenas mudar a cor das linhas com status='A'.

    Uma pergunta seu Grid já possui formatação?

    Todas suas Rows estão com status Preenchido como "A" ?

    Poste sua grid preenchida aqui para lhe dá uma resposta mais proveitosa!  

     


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Senior Developer C#
    Development Leader at JAMSOFT Informática
    Microsoft Certified Professional
    Criador e Mantenedor do EntityFramework Core for Firebird
    Contribuidor do EntityFramework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sexta-feira, 1 de dezembro de 2017 19:36

  • sexta-feira, 1 de dezembro de 2017 20:19
  • O Grid já está formatado, não são todos os status que estão preenchidos com "A"

    O Grid já está configurado como cor sim cor não, da forma como está se alterar a primeira linha do Grid com Status = "A", todo restante do Grid fica com cor verde.

    Se mudar o status da segunda linha em diante com Status = "A", funciona normalmente

    sexta-feira, 1 de dezembro de 2017 20:24
  • Preencha com mais informações o grid e coloque uma imagem que irei te explicar o que está acontecendo.

    Só pra adiantar: 

    Essa linha azul é o foco da linha selecionada.

    Essa linha azul é o que está lhe incomodando? 


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Senior Developer C#
    Development Leader at JAMSOFT Informática
    Microsoft Certified Professional
    Criador e Mantenedor do EntityFramework Core for Firebird
    Contribuidor do EntityFramework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter

    sexta-feira, 1 de dezembro de 2017 20:32
  • sexta-feira, 1 de dezembro de 2017 21:07
  • A linha azul é o foco da linha selecionada.

    A linha azul está correto, mas se alterar a primeira linha do Grid com Status = "A", todo restante do Grid ficara com a cor verde, mas só deve ficar verde a linha que foi alterado status para "A", se alterar o status da segunda linha em diante ai funciona normalmente, observe que a primeira coluna é do status e a linha que está verde está gravado status = "A"


    sexta-feira, 1 de dezembro de 2017 21:10
  • Podes fazer tua cor alternada e a cor para o valor "A" no mesmo lugar. No caso, tenho um DataGridView chamado Grid e vou aplicar duas cores alternadas, mas quando o valor de status for "A", a cor será verde.

            private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {           
                var row = Grid.Rows[e.RowIndex];
                var ativo = Grid.Rows[e.RowIndex].Cells["status"].Value.ToString();
                if (ativo == "a")
                row.DefaultCellStyle.BackColor = Color.Green;          
            }


    Caso tenha problemas com o flickering, aquela piscada nos valores da Grid, cria uma classe com este conteúdo:

    public static class DataGridViewExtensioncs
        {
            public static void DoubleBuffered(this DataGridView dgv, bool setting)
            {
                var dgvType = dgv.GetType();
                var pi = dgvType.GetProperty("DoubleBuffered",
                    BindingFlags.Instance | BindingFlags.NonPublic);
                pi?.SetValue(dgv, setting, null);
            }
        }

    E aplica na tua Grid na inicialização dos componentes:

    Grid.DoubleBuffered(true);

    Att,


    Antero Marques
    ______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.



    sexta-feira, 1 de dezembro de 2017 21:35
  • Podes fazer tua cor alternada e a cor para o valor "A" no mesmo lugar. No caso, tenho um DataGridView chamado Grid e vou aplicar duas cores alternadas, mas quando o valor de status for "A", a cor será verde.

            private void Grid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
            {           
                var row = Grid.Rows[e.RowIndex];
                var ativo = Grid.Rows[e.RowIndex].Cells["status"].Value.ToString();
                row.DefaultCellStyle.BackColor = (e.RowIndex + 2)%2 == 0 ? Color.CornflowerBlue : Color.BurlyWood;
    
                if (ativo == "a")
                row.DefaultCellStyle.BackColor = Color.Green;          
            }


    Caso tenha problemas com o flickering, aquela piscada nos valores da Grid, cria uma classe com este conteúdo:

    public static class DataGridViewExtensioncs
        {
            public static void DoubleBuffered(this DataGridView dgv, bool setting)
            {
                var dgvType = dgv.GetType();
                var pi = dgvType.GetProperty("DoubleBuffered",
                    BindingFlags.Instance | BindingFlags.NonPublic);
                pi?.SetValue(dgv, setting, null);
            }
        }

    E aplica na tua Grid na inicialização dos componentes:

    Grid.DoubleBuffered(true);

    Att,


    Antero Marques
    ______________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.


    Olá Antero tudo bem?!

    Antero com esse código irá até funcionar porém irá criar uma redundância infinita na aplicação, fazendo um loop de alocação de CPU/Memória.

    Se executar e já trazer formatado isso funcionar perfeito, mais se aplicar uma alteração no grid, entra a redundância de formatação.

    Minha sugestão seria usar uma função a parte pra isso:

    Fiz uma função usando parte de seu código como exemplo, acredito que com isso podemos ajudar nosso amigo Porter.

     private void FormatarGrid(DataGridView dataGridView)
            {
                if(dataGridView.DataSource != null && dataGridView.Rows.Count>0)
                {
    
                    for (int i = 0; i < dataGridView.Rows.Count; i++)
                    {
                        var row = dataGridView.Rows[i];
                        if(!row.IsNewRow)
                        {
                            var ativo = dataGridView[1, i].Value.ToString();
                            row.DefaultCellStyle.BackColor = i % 2 == 0 ? Color.CornflowerBlue : Color.BurlyWood;
    
                            if (ativo == "2")
                            {
                                Console.WriteLine(i);
                                row.DefaultCellStyle.BackColor = Color.Green;
                            }
                        } 
                    }
                }
            }

    E faria a chamada após carregar/alterar o grid!

    Ex: FormatarGrid(seuGrid);


    Se a resposta for relevante ou tenha resolvido seu problema, marque como útil/resposta!

    Rafael Almeida
    Senior Developer C#
    Development Leader at JAMSOFT Informática
    Microsoft Certified Professional
    Criador e Mantenedor do EntityFramework Core for Firebird
    Contribuidor do EntityFramework Core
    Email: ralms@ralms.net
    Blog -  GitHub  -  LinkedIn -  Twitter


    sexta-feira, 1 de dezembro de 2017 23:27
  • Rafael,

    Perfeito. Concordo plenamente.

    Ele pode setar a cor alternada direto:

    Grid.AlternatingRowsDefaultCellStyle.BackColor = Color.Gainsboro;

    E usar essa formatação no final do evento de adição da nova linha:

            private void FormataGrid(DataGridView grid)
            {
                foreach (var row in grid.Rows.OfType<DataGridViewRow>())
                {
                    var ativo = row.Cells["status"].Value.ToString();
                    if (ativo == "a")
                        row.DefaultCellStyle.BackColor = Color.Green;
                }
            }

    Att,


    Antero Marques
    _____________________________________________________________________________
    Se a resposta for útil, marque como útil, se respondeu totalmente sua dúvida, marque como resposta. O Fórum MSDN é utilizado também como base de conhecimento, então é responsabilidade de todos mantê-lo organizado e funcional.





    sábado, 2 de dezembro de 2017 02:30