none
Dúvida na formatação de celulas em gridview RRS feed

  • 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
    sábado, 2 de outubro de 2010 03:17

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 If

     

    Tenta 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
    domingo, 3 de outubro de 2010 21:55

Todas as Respostas

  • Você está usando thread? o grid pisca é quando ____ o scroll?

    Bruno Ferreira de Souza
    Analista Desenvolvedor .NET
    MCP - Windows Form
    sábado, 2 de outubro de 2010 03:31
  • 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
    domingo, 3 de outubro de 2010 21:12
  • 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 If

     

    Tenta 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
    domingo, 3 de outubro de 2010 21:55
  • 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
    segunda-feira, 4 de outubro de 2010 16:37
    Moderador
  • 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
    terça-feira, 12 de outubro de 2010 20:29
  • 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
    • Marcado como Resposta Joviano quarta-feira, 1 de dezembro de 2010 16:53
    • Não Marcado como Resposta Joviano quarta-feira, 1 de dezembro de 2010 16:54
    sábado, 27 de novembro de 2010 23:44
    Moderador
  • 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 If

     

    Tenta 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
    quarta-feira, 1 de dezembro de 2010 16:55