none
Alterar valor de DataGridView e mudar cor de célula RRS feed

  • Pergunta

  • Boa Noite!

    Estou com essa dúvida há alguns dias.

    Eu tenho uma datagridview que quando clico na célula que contém um checkbox, ele deve colorir a célula do lado.

    Eu quero que a cor seja mudada assim que o usuário clicar no checkbox.

    O problema é com a atualização do valor, já que estou utilizando a propriedade CellValueChanged e ele não muda o valor instantaneamente.

    Tentei utilizar o CurrentCellDirtyStateChanged, mas ai que ocorre o problema, quando estou em debug não ocorre erro nenhum. Mas quando estou no exe, em algumas situações aleatórias, ele dá o seguinte erro:  

    "Index was out of range. Must be non-negative and less than the size of the collection.
    Parameter name: index"

    Por favor, como eu resolveria isso?

    quinta-feira, 24 de setembro de 2015 01:58

Respostas

  • Olá, Paula!

       Você pode postar o código que está sendo executado dentro deste evento? Fiz um teste bem simples e com poucos dados, utilizando a codificação abaixo, executei o .exe e não deu a mensagem de erro em nenhum momento.

    this.dataGridView1.CurrentRow.Cells[2].Style.BackColor = Convert.ToBoolean(this.dataGridView1.CurrentRow.Cells[Chk.Name].GetEditedFormattedValue(0, DataGridViewDataErrorContexts.LeaveControl)) ? Color.Red : Color.Green;
    this.dataGridView1.EndEdit();
    

    Já tive problemas com o datagrid, mas foram relacionados a outra situação, onde devido a um bug do VS era necessário manipular o evento DataError do grid. Talvez você possa verificar isto também. Se não estou enganado, era adicionado o código e.Cancel = false; dentro do evento.

    Boa sorte!

    • Marcado como Resposta Marcos SJ quarta-feira, 30 de setembro de 2015 20:21
    terça-feira, 29 de setembro de 2015 17:07

Todas as Respostas

  • Aki esta a solucao, muito simples:

    http://stackoverflow.com/questions/19162248/index-was-out-of-range-must-be-non-negative-and-less-than-the-size-of-the-colle


    A flower cannot blossom without sunshine, and man cannot live without love.

    quinta-feira, 24 de setembro de 2015 14:57
    Moderador
  • Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
            If (e.ColumnIndex.Equals(0)) Then
                Dim item As DataGridViewCheckBoxCell =
                   DirectCast(DataGridView1.Rows(e.RowIndex).Cells(0), DataGridViewCheckBoxCell)
                Me.Text = item.Value.ToString()
            End If
        End Sub

    ou

    Private Sub DataGridView1_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
            If (e.ColumnIndex > -1 And
                e.RowIndex > -1) Then
                If (e.ColumnIndex.Equals(0)) Then
                    Dim item As DataGridViewCheckBoxCell =
                       DirectCast(DataGridView1.Rows(e.RowIndex).Cells(0), DataGridViewCheckBoxCell)
                    Dim status As Boolean = Boolean.Parse(item.Value)
                    If (status) Then
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.Blue
                    Else
                        DataGridView1.Rows(e.RowIndex).DefaultCellStyle.BackColor = Color.White
                    End If
                End If
            End If
        End Sub


    Fulvio Cezar Canducci Dias


    quinta-feira, 24 de setembro de 2015 16:30
  • Uma solução é utilizar o evento Click.

    Toda vez que tiver um evento click você...

    01 - vê se o click foi na coluna do checkbox

    02 - se foi, você percorre o grid até o fim verificando a coluna que está a checkbox.

    Se DataGridView[linha, coluna].Value != null && DataGridView[linha, coluna].Value == true

    pinta a célula DataGridView[linha,Coluna + 1]

    else

    célula DataGridView[linha, Coluna + 1] recebe "cor neutra"

    quinta-feira, 24 de setembro de 2015 17:32
  • Boa Noite!

    Obrigada pelas respostas.

    Entretanto, quanto ao evento click, eu já tinha testado ele. Na realidade, o programa funciona e não dá mensagem de erro se eu não utilizar o CurrentCellDirtyStateChanged, mas eu quero que a atualização dos valores seja feita no instante em que o usuário clica no check. Ao usar o click ou cellclick, ele só muda a cor quando clico em outra célula.

    Esse erro acima não atrapalha o funcionamento do CurrentCellDirtyStateChanged, mas surge essa mensagem aleatoriamente. Mesmo tratando nas rotinas, ele não chega em nenhuma delas.

    Já verifiquei as colunas e todas elas existem na datagridview.


    sexta-feira, 25 de setembro de 2015 01:35
  • Olá, Paula!

       Você pode postar o código que está sendo executado dentro deste evento? Fiz um teste bem simples e com poucos dados, utilizando a codificação abaixo, executei o .exe e não deu a mensagem de erro em nenhum momento.

    this.dataGridView1.CurrentRow.Cells[2].Style.BackColor = Convert.ToBoolean(this.dataGridView1.CurrentRow.Cells[Chk.Name].GetEditedFormattedValue(0, DataGridViewDataErrorContexts.LeaveControl)) ? Color.Red : Color.Green;
    this.dataGridView1.EndEdit();
    

    Já tive problemas com o datagrid, mas foram relacionados a outra situação, onde devido a um bug do VS era necessário manipular o evento DataError do grid. Talvez você possa verificar isto também. Se não estou enganado, era adicionado o código e.Cancel = false; dentro do evento.

    Boa sorte!

    • Marcado como Resposta Marcos SJ quarta-feira, 30 de setembro de 2015 20:21
    terça-feira, 29 de setembro de 2015 17:07
  • Obrigada pela ajuda, Rodrigo CdS!

    Vou verificar esses casos.


    • Editado Marcos SJ quinta-feira, 8 de outubro de 2015 17:12 Edição
    segunda-feira, 5 de outubro de 2015 00:38