Usuário com melhor resposta
Dúvida na formatação de celulas em gridview

Pergunta
-
Ola, tenho um form elaborada no winforms onde formato o datagridview de acordo com o valor de uma celula, e uso o cellformating, porem como esse grid tem muitas lnhas, da para ver as linhas piscando, e nem sempre o formulario é carregado por inteiro devido o cellformating estar pintando as linhas do grid. existe uma forma de que ele nao fique a cada evento do form repintando? tipo so repintar quando eu solicitar?
No aguardo,
Joviano
Respostas
-
Sim, o CellFormating é executado sempre que há valor no grid. Como que você popula esses dados, está jogando o datasource ou está adicionando linha por linha? Se não permitir alterações no grid, você pode usa essas formatações logo após popular o grid. Caso o grid sofra constantes alterações, o que você pode fazer nesse código é verificar se uma propriedade já não está no estado que você quer para sim alterá-la.
Ex:
Private Sub GRID_CAD_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles GRID_CAD.CellFormatting
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "VALOR" Then
e.Value = FormatCurrency(e.Value.ToString(), 2, TriState.True, TriState.True, TriState.True)
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
If Not e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight Then
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
End If
End If
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "D/C" Then
If e.Value = "D" Then
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red
End If
Else
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue
End If
End If
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
End IfTenta e vê se te ajuda.
Bruno Ferreira de Souza
Analista Desenvolvedor .NET
MCP - Windows Form- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:41
- Marcado como Resposta Joviano quarta-feira, 1 de dezembro de 2010 16:54
Todas as Respostas
-
-
Olha o codigo que estou usando.
Private Sub GRID_CAD_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles GRID_CAD.CellFormatting If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "VALOR" Then e.Value = FormatCurrency(e.Value.ToString(), 2, TriState.True, TriState.True, TriState.True) e.FormattingApplied = True e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight End If If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "D/C" Then If e.Value = "D" Then GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red Else GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue End If e.FormattingApplied = True End If End Sub
O que acontece é que quando estou na tela cadastrando alguem, em cada evendo da tela, ele executa esse procedimento. se colocar um breakpoint voce percebe que esse evento nao para de ser executado.
Joviano -
Sim, o CellFormating é executado sempre que há valor no grid. Como que você popula esses dados, está jogando o datasource ou está adicionando linha por linha? Se não permitir alterações no grid, você pode usa essas formatações logo após popular o grid. Caso o grid sofra constantes alterações, o que você pode fazer nesse código é verificar se uma propriedade já não está no estado que você quer para sim alterá-la.
Ex:
Private Sub GRID_CAD_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles GRID_CAD.CellFormatting
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "VALOR" Then
e.Value = FormatCurrency(e.Value.ToString(), 2, TriState.True, TriState.True, TriState.True)
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
If Not e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight Then
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
End If
End If
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "D/C" Then
If e.Value = "D" Then
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red
End If
Else
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue
End If
End If
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
End IfTenta e vê se te ajuda.
Bruno Ferreira de Souza
Analista Desenvolvedor .NET
MCP - Windows Form- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:41
- Marcado como Resposta Joviano quarta-feira, 1 de dezembro de 2010 16:54
-
Joviano,
Uma vez tive um problema de performance fazendo algo parecido com o que você está fazendo... Eu estava utilizando o evento CellFormatting como você e ficou absurdamente lento devido à grande quantidade de dados que eu estava exibindo na DataGridView...
No meu caso, uma vez que os dados estivessem carregados na grid, eu não precisaria mais alterar a formatação das células... Então, acabei fazendo como o Bruno sugeriu... Ao invés de deixar a formatação sempre ativa, eu coloquei a formatação no DataBindingComplete da grid, onde eu percorri todas as linhas e fiz a formatação necessária... Dessa forma a performance incomparavelmente melhor...
André Alves de Lima
Visite o meu site: http://andrealveslima.spaces.live.com
Me siga no Twitter: @andrealveslima- Sugerido como Resposta AndreAlvesLimaModerator terça-feira, 5 de outubro de 2010 01:41
-
Boa tarde!
Desculpa pela demora da resposta, mas é que estava em viagen e nao tive tempo de ver as respostas.
Bom, tentei o exemplo Bruno, porem mesmo assim, ainda para para ver o grid sendo formatado, isso so é visivel quando se tem duas linhas de cores diferentes, é muito rapido, mas da para ver elas piscando. Outro problema que da, é que se der alt + tab, ou mudar de tela, quando voltar a tela que estava, nao a aparece os campos, fica como se tivesse sido travado o computador, com excessão do grid que fica la piscando. rsrs
André, com que voce fez para percorrer o grid no evento DataBindingComplete , sendo que o "e" dele é de outro tipo de dados, mudo ele?
Obrigado pelas ajudas, e no aguardo,
Joviano- Marcado como Resposta Joviano quarta-feira, 24 de novembro de 2010 20:00
- Não Marcado como Resposta Joviano quarta-feira, 24 de novembro de 2010 20:01
- Marcado como Resposta Joviano quarta-feira, 24 de novembro de 2010 20:02
- Não Marcado como Resposta AndreAlvesLimaModerator sábado, 27 de novembro de 2010 23:43
-
Joviano,
Conseguiu solucionar o seu problema? Se sim, por favor, poste qual foi a solução utilizada ou marque como resposta os posts que te ajudaram a solucionar o seu problema (e não o seu próprio post com a pergunta!)...
Obrigado pelo apoio...
André Alves de Lima
Visite o meu site: http://www.andrealveslima.com.br
Me siga no Twitter: @andrealveslima -
Sim, o CellFormating é executado sempre que há valor no grid. Como que você popula esses dados, está jogando o datasource ou está adicionando linha por linha? Se não permitir alterações no grid, você pode usa essas formatações logo após popular o grid. Caso o grid sofra constantes alterações, o que você pode fazer nesse código é verificar se uma propriedade já não está no estado que você quer para sim alterá-la.
Ex:
Private Sub GRID_CAD_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles GRID_CAD.CellFormatting
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "VALOR" Then
e.Value = FormatCurrency(e.Value.ToString(), 2, TriState.True, TriState.True, TriState.True)
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
If Not e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight Then
e.CellStyle.Alignment = DataGridViewContentAlignment.MiddleRight
End If
End If
If Me.GRID_CAD.Columns(e.ColumnIndex).Name = "D/C" Then
If e.Value = "D" Then
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Red
End If
Else
If Not GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue Then
GRID_CAD.RowsDefaultCellStyle.ForeColor = Color.Blue
End If
End If
If Not e.FormattingApplied Then
e.FormattingApplied = True
End If
End IfTenta e vê se te ajuda.
Bruno Ferreira de Souza
Analista Desenvolvedor .NET
MCP - Windows Form
Esta opção ajudou, porem descidi nao usar, pois mesmo assim, continua aparecendo a tela piscando.
Joviano