Como puedo capturar un evento de un checkbox que pertenece a un
datagridview? Osea, tengo toda una columna de checkbox para que el
usuario pueda marcar o desmarcar filas. Como capturo cuando el usuario
marque o desmarque un checkbox?
Muchas gracias de antemano.
Juan carlos Pinto.
Hola, Juan Carlos:
Si solamente quieres saber cuando el usuario ha efectuado un clic en la
celda tipo DataGridViewCheckBoxCell, puedes utilizar el evento
«CellContentClick» del control DataGridView. Pero si también quieres conocer
el valor actual del control, entonces tendrás que confirmar inmediatamente
los cambios en el evento «CurrentCellDirtyStateChanged» y controlar el
evento «CellValueChanged» (que se desencadena antes que el evento
«CellContentClick») donde podrás conocer el valor actual del control.
Suponiendo que la segunda columna del control DataGridView (índice 1) es del
tipo DataGridViewCheckBoxColumn, actuarías de la siguiente manera:
Private Sub DataGridView1_CellValueChanged( ... )
' Si no es la segunda columna, abandonamos el procedimiento
'
If e.ColumnIndex <> 1 Then Return
' Referenciamos el control DataGridViewCheckBoxCell actual
'
Dim cb As DataGridViewCheckBoxCell = _
TryCast(Me.DataGridView1.CurrentCell, DataGridViewCheckBoxCell)
If cb IsNot Nothing Then
Dim bln As Boolean = CBool(cb.Value)
MessageBox.Show(bln.ToString)
End If
End Sub
Private Sub DataGridView1_CurrentCellDirtyStateChanged( ... )
' Referenciamos el control DataGridViewCheckBoxCell actual
'
Dim cb As DataGridViewCheckBoxCell = _
TryCast(Me.DataGridView1.CurrentCell, DataGridViewCheckBoxCell)
If cb IsNot Nothing Then
' Confirmammos los cambios efectuados en la celda actual
'
DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
Ok, muchas gracias Enrique.
Un saludo.
Hola Enrique!
He estado probando con lo que me aconsejaste. Y me funciona bien, pero
tengo un problemilla...
Ante todo te pongo el código que tengo implantado:
Private Sub DGSeries_CellValueChanged(ByVal Sender As Object, ByVal e
As DataGridViewCellEventArgs) _
Handles DGSeries.CellValueChanged
' Compruebo que no sea la primera vez que lleno el
datagridview
If bandera = True Then Exit Sub
' Si no es la primera columna, abandono el procedimiento
'
If e.ColumnIndex <> 0 Then Return
' Referenciamos el control DataGridViewCheckBoxCell a
Dim cb As DataGridViewCheckBoxCell =
TryCast(Me.DGSeries.CurrentCell, DataGridViewCheckBoxCell)
If cb IsNot Nothing Then
Dim bln As Boolean = CBool(cb.Value)
If bln = True Then
NumeroSeries += 1
If NumeroSeries > licenciaspermitidas Then
DGSeries.CurrentRow.Cells(0).Value = False
End If
Else
' si está marcado
NumeroSeries -= 1
End If
LBNSSeleccionadas.Text = NumeroSeries.ToString
End If
End Sub
Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal
Sender As Object, ByVal e As EventArgs) _
Handles DGSeries.CurrentCellDirtyStateChanged
' Comprobamos que no sea la primera vez que se llena el
datagridview
If bandera = True Then Exit Sub
' Referenciamos el control DataGridViewCheckBoxCell actual
'
Dim cb As DataGridViewCheckBoxCell =
TryCast(Me.DGSeries.CurrentCell, DataGridViewCheckBoxCell)
If cb IsNot Nothing Then
DGSeries.CommitEdit(DataGridViewDataErrorContexts.Commit)
End If
End Sub
Aqui hay una variables, que son NumeroSeries, que simplemente es un
contador, de las filas con el checkbox marcado, LicenciasPermitidas,
que es una variable con la cual comparo la anterior, y lo que quiero
es que cuando ambas tengan el mismo valor, no me deje marcar más
checkbox del datagridview. Y este es el momento que consigo. Consigo
que le contador no corra, pero el checkbox sigue marcandose...
He intentado averiguar el funcionamiento del codigo que me mandaste
pero se me hace un poco dificil de entender...
Si puedes explicarme que falla?
Un saludo muy grande
Juan Carlos Pinto
> tengo un problemilla...
> Ante todo te pongo el código que tengo implantado:
>
> Aqui hay una variables, que son NumeroSeries, que simplemente es un
> contador, de las filas con el checkbox marcado, LicenciasPermitidas,
> que es una variable con la cual comparo la anterior, y lo que quiero
> es que cuando ambas tengan el mismo valor, no me deje marcar más
> checkbox del datagridview. Y este es el momento que consigo. Consigo
> que le contador no corra, pero el checkbox sigue marcandose...
>
> He intentado averiguar el funcionamiento del codigo que me mandaste
> pero se me hace un poco dificil de entender...
>
> Si puedes explicarme que falla?
El código que te indiqué poco tiene que ver con lo que tú pretendes
conseguir. El ejemplo, simplemente era para contestar al asunto de tu
mensaje, de tal manera que pudieras capturar el evento que se produce cuando
el usuario hace clic en las columnas tipo CheckBox existentes en un control
DataGridView, pero para poco más sirve.
Y asimismo, entiendo que el control DataGridView tampoco está capacitado
para que el usuario sólo puede marcar un número de casillas CheckBox en
función del valor de una variable. Una columna tipo CheckBox, generalmente
contiene un valor Boolean que se corresponderá con el valor que dicho campo
tenga en la tabla de la base de datos. Pero tú estás limitando a que sólo un
número determinado de filas (2, 3 ó 14 filas) puedan tener el valor True en
la columna que alberga el control CheckBox.
Si no deseas que aparezca la marca de verificación en el control CkeckBox
cuando el valor de la variable «NumeroSeries» sea igual al de la variable
«licenciaspermitidas», lo único que te puedo decir por ahora es que en el
evento «CellValueChanged», aceptes los cambios del objeto DataTable al cual
se encuentra enlazado el control DataGridView:
Private Sub DGSeries_CellValueChanged( ... )
' Compruebo que no sea la primera vez que
' lleno el DataGridView
'
If bandera = True Then Exit Sub
' Si no es la primera columna, abandono el procedimiento
'
If e.ColumnIndex <> 0 Then Return
' Referenciamos el control DataGridViewCheckBoxCell
'
Dim cb As DataGridViewCheckBoxCell = _
TryCast(Me.DGSeries.CurrentCell, DataGridViewCheckBoxCell)
If cb Is Nothing Then Return
' Referenciamos el objeto DataTable que se encuentra
' enlazado al control DataGridView
'
Dim dt As DataTable = DirectCast(DGSeries.DataSource, DataTable)
Dim bln As Boolean = CBool(cb.Value)
If bln = True Then
NumeroSeries += 1
If NumeroSeries > licenciaspermitidas Then
cb.Value = False
End If
Else
' si está marcado
NumeroSeries -= 1
End If
' Aceptamos los cambios en el objeto DataTable
'
dt.AcceptChanges()
LBNSSeleccionadas.Text = NumeroSeries.ToString
End Sub
Por supuesto, el evento «CurrentCellDirtyStateChanged» se quedaría tal cual
lo tienes implementado.
Ahora, lo que hace falta es no me digas que el control DataGridView no se
encuentra enlazado a ningún control. Si es este tu caso, entonces te diré
que controles el evento «CellBeginEdit» del control DataGridView, el cual se
desencadena cuando se comienza a editar cualquier columna del control,
evento éste que te da la posibilidad de cancelar la operación de edición
simplemente estableciendo el valor «True» a la propiedad «Cancel» del
parámetro «DataGridViewCellCancelEventArgs» del procedimiento de evento:
Private Sub DGSeries_CellBeginEdit( ... )
' Si no es la primera columna, abandono el procedimiento
'
If e.ColumnIndex <> 0 Then Return
' Si procede cancelo la edición de la celda
'
If procedeCancelar Then
e.Cancel = True
End If
End Sub
Pero también te digo, que el evento «CellBeginEdit» se desencadena antes que
los eventos «CurrentCellDirtyStateChanged» y «CellValueChanged». Así que...
¡A ver como te las apañas! :-)