Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Capturar evento de checkbox en un datagridview

2,959 views
Skip to first unread message

jcp...@dpstudio.es

unread,
Oct 4, 2008, 8:06:17 AM10/4/08
to
Hola a todos!

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.

SoftJaén

unread,
Oct 4, 2008, 10:42:59 AM10/4/08
to
<jcp...@dpstudio.es> preguntó:

>
> 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?

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.

jcpinto

unread,
Oct 6, 2008, 4:24:25 AM10/6/08
to
On 4 oct, 16:42, SoftJaén <grupo_notic...@softjaen.es> wrote:
> <jcpi...@dpstudio.es> preguntó:


Ok, muchas gracias Enrique.
Un saludo.

jcpinto

unread,
Oct 6, 2008, 3:36:40 PM10/6/08
to
On 6 oct, 10:24, jcpinto <jcpi...@dpstudio.es> wrote:


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

SoftJaén

unread,
Oct 7, 2008, 9:37:20 AM10/7/08
to
"jcpinto" escribió:

> 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! :-)

0 new messages