Gostaria de mudar a cor de uma linha específica no meu DataGridView. A linha deve ser alterada para vermelho quando o valor da célula da coluna 7 for menor que o valor da célula da coluna 10. Alguma sugestão sobre como fazer isso?
143
Eu estava apenas investigando esse problema (então eu sei que essa pergunta foi publicada há quase 3 anos, mas talvez ajude alguém ...), mas parece que uma opção melhor é colocar o código dentro do
RowPrePaint
evento para que você não precisa percorrer todas as linhas, apenas as que são pintadas (para que ele tenha um desempenho muito melhor em grande quantidade de dados:Anexar ao evento
O código do evento
fonte
Você está procurando o
CellFormatting
evento.Aqui está um exemplo.
fonte
Também tive problemas para alterar a cor do texto - nunca vi a cor mudar.
Até eu adicionei o código para alterar a cor do texto para o evento
DataBindingsComplete
paraDataGridView
. Depois disso, funcionou.Espero que isso ajude as pessoas que enfrentam o mesmo problema.
fonte
Algo como o seguinte ... assumindo que os valores nas células sejam Inteiros.
não testado, portanto, desculpe-me por qualquer erro.
Se você conhece a linha específica, pode pular a iteração:
fonte
Algumas pessoas gostam de usar os eventos
Paint
,CellPainting
ouCellFormatting
, mas observe que a alteração de um estilo nesses eventos causa chamadas recursivas. Se você o usar,DataBindingComplete
ele será executado apenas uma vez. O argumento paraCellFormatting
é que ele é chamado apenas em células visíveis, para que você não precise formatar células não visíveis, mas as formate várias vezes.fonte
Você pode alterar
Backcolor
linha por linha usando seu condition.and esta chamada de função após a aplicaçãoDatasource
deDatagridView
.Aqui está a função para isso. Simplesmente copie e coloque depois
Databind
fonte
fonte
Esta é minha solução para alterar a cor para dataGridView com bindingDataSource:
fonte
Se você vincular a uma (coleção) de objetos concretos, poderá obtê-lo através da propriedade DataBoundItem da linha. (Para evitar verificar seqüências de caracteres mágicas na célula e usar propriedades "reais" do objeto)
Exemplo de esqueleto abaixo:
DTO / POCO
Ligação à DataGridView
o manipulador de eventos e a obtenção do objeto concreto (em vez de um DataGridRow e / ou células)
fonte
Eu normalmente gosto de usar o evento GridView.RowDataBound Event para isso.
fonte
Funciona no Visual Studio 2010. (Eu tentei e funciona!) Ele pintará sua linha inteira.
datagridview
.CellClick
evento e coloque a próxima linha de código dentro dele.fonte
Você não mencionou como o valor é alterado. Eu usei funcionalidade semelhante quando o usuário está inserindo valor. ou seja, entrando e saindo do modo de edição.
Usando o evento CellEndEdit do datagridview.
Você pode adicionar lógica para limpar a notificação de erro de maneira semelhante.
se no seu caso, se os dados forem carregados programaticamente, o evento CellLeave poderá ser usado com o mesmo código.
fonte
Com esse código, você altera apenas a cor de fundo das linhas onde o valor do nome da coluna é nulo, outras linhas ainda são as cores padrão
fonte
Apenas uma observação sobre a configuração
DefaultCellStyle.BackColor
... você não pode configurá-lo para qualquer valor transparente, excetoColor.Empty
. Esse é o valor padrão. Isso implica falsamente (para mim, pelo menos) que cores transparentes sejam aceitáveis. Eles não são. Cada linha que eu defino como uma cor transparente apenas desenha a cor das linhas selecionadas.Passei muito tempo batendo minha cabeça contra a parede por causa dessa questão.
fonte
Cheguei aqui procurando uma solução para o caso em que não uso a ligação de dados. Nada funcionou para mim, mas eu consegui no final com:
fonte
Se você é o segundo desenvolvedor mais burro do planeta (eu sendo o mais burro), todas as soluções acima parecem funcionar: CellFormatting, DataSourceChanged e RowPrePaint. Eu prefiro RowPrePaint.
Lutei com isso (por muito tempo) porque precisava substituir meu SelectionBackColor e SelectionForeColor em vez de BackColor e ForeColor, pois eu estava alterando a linha selecionada.
fonte
fonte