[2005] DatagridView com Checkbox - Visual Basic .NET - Portugal-a-Programar
[2005] DatagridView com Checkbox
Por Weasel, 10 de Dezembro de 2007 em Visual Basic .NET
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...
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
Mas e na Datagridview?
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)
Ahh, então nas datagridview é sempre através do Value...
Bem resultou, mais ou menos
Coloquei assim só para testar:
MsgBox(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value)
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?
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
If CType(DataGridView1.Item("activo", e.RowIndex).Value, Boolean) = True Then
DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = False
DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value = True
MsgBox(CType(DataGridView1.Item(e.ColumnIndex, e.RowIndex).Value, Boolean))
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 2 de Julho de 2012 por djbarbas
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' ...
'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
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:
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
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.