miércoles, 25 de enero de 2012

DataGridViewCheckBoxColumn: Detectar el cambio/check en el evento CellValueChanged


Huston… teniamos un problema! Va yo era el del problema. Con un amigo del trabajo Pedro (flamante programador Clipper!) teniamos que realizar acciones en un winform en un control Datagridview con un Checkbox. Simple no? Pero cuando queriamos acceder por codigo al valor de la columna DataGridViewCheckBoxColumn CellValueChanged no teniamos el cambio actual.

Problema

Tenemos una grilla con una columna DataGridViewCheckBoxColumn
image
Para que cuando tengamos evento click en el check…
image
LO PODAMOS DETECTAR !!! Pense que era mas facil de lo que crei, pero por eso aqui esta este instructivo con las dos opciones:
Antes que nada… explicación de porque no podemos hacer simplemente…con los eventos como las otras celdas:
Pero si lo hacemos en el evento CellContentClick, no tendremos actualizado el valor del check 
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

    MsgBox("Estado: " & Me.DataGridView1.Rows(e.RowIndex).Cells("check").Value)

End Sub
(from MSDN…)CellContentClick: Para los clicks en DataGridViewCheckBoxCell este evento se produce antes de que cambie el valor de la casilla de verificación(…)
Si lo hacemos aqui CellValueChanged (que es donde deberiamos consultar por naturaleza) solo se produce cuando el usuario deja la celda actual. Esto sucede porque los cambios no se plasman hasta luego de ejecutar el evento CellEndEdit.


OPCION 1: La parte “ortodoxa”… cambiar el estado por nosotros mismos. Tenemos el control

Aqui la idea es cambiar la propiedad de esta columna DataGridViewCheckBoxColumn a ReadOnly
image 
image
Y en el evento CellContentClick, tendremos que ”artesanalmente” cambiar de estado… y alli si podremos recuperarlo.
Private Sub DataGridView1_CellContentClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick

   If e.ColumnIndex = Me.DataGridView1.Columns.Item("check").Index Then
       Dim chkCell As DataGridViewCheckBoxCell = Me.DataGridView1.Rows(e.RowIndex).Cells("check")
       chkCell.Value = Not chkCell.Value
   End If

   MsgBox("Estado: " & EstadoCheck(e.RowIndex))

End Sub
(Nota: Aqui la columna checkbox se llama “check”, y el metodo EstadoCheck solo obtiene el estado del la columna con el check – para demo)
Entonces? Aqui es una forma ortodoxa de conseguir nuestro objetivo: “Tener un poco de control en el OnClick del checkbox en una columna DataGridViewCheckBoxColumn del Datagridview”


OPCION 2:  Tener control del cambio en el CheckBoxColumn: Evento CurrentCellDirtyStateChanged (cuando se cambia el estado de alguna celda)

Esta opcion es la recomendacion de MSDN asi que, aqui va…
La columna checkbox (DataGridViewCheckBoxColumn) la dejamos como esta… sin propiedad ReanOnly seteada.
En el evento CurrentCellDirtyStateChanged preguntamos si la celda actual tiene cambios sin confirmar (propiedad IsCurrentCellDirty)
Private Sub DataGridView1_CurrentCellDirtyStateChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
       If DataGridView1.IsCurrentCellDirty Then
           DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
       End If
   End Sub
         y alli si podremos consultar el valor… en el evento por naturaleza
Private Sub DataGridView1_CellValueChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged

       MsgBox("Estado: " & EstadoCheck(e.RowIndex))

End Sub


Enlaces:

Fuente : http://geeks.ms

No hay comentarios:

Publicar un comentario