• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Weasel

[2005] DatagridView com Checkbox

9 mensagens neste tópico

Como posso aceder à checkbox que tenho na minha datagridview? Para poder verificar o estado dela .Checked = True, e para também poder alterar o estado...

Já andei a ver mas não descubro como...

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem a 1ª parte do problema já resolvi

DatagridView1.item(coluna, linha).Value = True / False

Agora surgiu outro problema, eu queria que ao clicar na checkbox, esse valor fosse gravado na base de dados, qual é o evento de clicar na checkbox numa DatagridView?

Uma checkbox normal seria

Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

    End Sub

Mas e na Datagridview?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ahh, então nas datagridview é sempre através do Value...

Ok vou experimentar...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem resultou, mais ou menos

Coloquei assim só para testar:

Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
        MsgBox(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value)
    End Sub

E quando a checkbox não tá checked e clico nela (passando agora a estar) o valor que dá na msgbox é o False ou seja o valor antes de clicar, e ao contrário o mesmo se já estava checked, ao desmarcar vai dizer true, ou seja o valor antes de clicar....não haverá um método melhor?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas,

Reparei que este Post tem alguns anos e ainda assim não obteve resposta. Tive o mesmo problema que o utilizador CRLF, mas consegui ultrapassar o problema da seguinte forma, a qual passo a explicar

Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

 If CType(DataGridView1.Item("activo", e.RowIndex).Value, Boolean) = True Then
	  DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = False
 Else
	  DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = True
 End If

 MsgBox(CType(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value, Boolean))
End Sub

O problema era que a checkbox assumia sempre o valor inicial do atributo "checked" no campo "value" no momento em que o objecto era focado (focus), só assumindo novo valor proveniente do atributo checked a quando da perca do foco (lostfocus).

Após verificar o problema, resolvi criar este trocadilho que não é nada mais nada menos que ler o "value" actual e inverter o seu valor.

Sei que a solução aqui apresentada não deve ser a melhor ou mais inteligente, mas como este POST ainda não tinha uma solução e como passei pelo mesmo problema resolvi deixar aqui a minha contribuição.

Se alguém sabe como resolver este problema de outra forma agradecia que deixa-se aqui o seu contributi.

Editado por djbarbas
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá djbarbas.

O teu código não faz bem aquilo que estás a pensar.

O que ele faz é:

se o utilizador clicar numa qualquer célula da dgview, coloca nessa célula o valor contrário ao da respetiva coluna 'Activo' ...

Uma das soluções é:

Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
    Try
	    'testa sómente se o valor da coluna 'Activo' foi modificado
	    If e.ColumnIndex = sender.Columns("Activo").Index Then
		    MsgBox(sender(e.ColumnIndex, e.RowIndex).VALUE)
		    'fazer update à bd
	    End If
    Catch : End Try
   End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa tarde jlpcalado,

Desculpe tem razão, no meu projecto tenho um Select que me resolve isso, esqueci-me de mencionar aqui. Fica então assim:

Private Sub DataGridView1_CellContentClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Select Case e.ColumnIndex

Case DataGridView1.Columns("activo").Index       ' activo é o nome que designei a esta coluna

        If CType(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value, Boolean) = True Then
                 DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = False
        Else
                 DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = True
        End If

        MsgBox(CType(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value, Boolean))
End Select
End Sub

Em relação ao teu código não resolve o problema, ele irá sempre manter a propriedade Value a "True" ou a "False", independentemente se a propriedade "checked" está picada ou não. Supõe que o por defeito a checkbox está picada logo o "Value" é igual a "True", ao clicares o visto sai mas contudo o "Value" fica sempre a "True", idependentemente de quantos cliques deres. Ele só irá assumir o "Value" correcto quando perder o o foco (Focus), ou seja a propriedade "Value" só será actualizada pela propriedade "Checked" quando clicar noutro sítio que não ele.

Editado por djbarbas
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boa tarde djbarbas.

Bom. Assim já é outra coisa.

O interessante é que aquilo que as instruções

DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = False ou True,

fazem é desencadear, implicita/, o evento 'CellValueChanged'

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora