Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

Weasel

[2005] DatagridView com Checkbox

Mensagens Recomendadas

Weasel    3
Weasel

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!

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Revolt    1
Revolt

podes usar o evento DataGridView.SelectionChanged (http://msdn2.microsoft.com/en-us/library/system.windows.forms.datagridview.selectionchanged.aspx)

e depois verificar se a célula seleccionada tem o valor de True/False utilizando DataGridView.SelectedCells (http://msdn2.microsoft.com/en-us/library/system.windows.forms.datagridview.selectedcells.aspx)

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Weasel    3
Weasel

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?

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djbarbas    0
djbarbas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jlpcalado    3
jlpcalado

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
djbarbas    0
djbarbas

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
jlpcalado    3
jlpcalado

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'

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


×

Aviso Sobre Cookies

Ao usar este site você aceita a nossa Política de Privacidade