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
Para que cuando tengamos evento click en el check…
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
Pero si lo hacemos en el evento CellContentClick
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
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 CurrentCellDirtyStateChangedpreguntamos 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:
- DataGridView.CellEndEdit
(Evento)
Se produce cuando se detiene el modo de edición para la celda seleccionada actualmente. - DataGridView.CellContentClick
(Evento)
Se produce cuando se hace clic en el contenido de una celda. - DataGridView.CurrentCellDirtyStateChanged
(Evento)
Se produce cuando el estado de una celda cambia en relación con un cambio de su contenido. - DataGridView.CommitEdit
(Método)
Confirma los cambios realizados a la celda actual en la caché de datos sin salir del modo de edición. - DataGridView.IsCurrentCellDirty
(Propiedad)
Obtiene un valor que indica si la celda actual tiene cambios sin confirmar. - Exploring GridView Control Events
http://msdn.microsoft.com/en-us/library/ms993231.aspx
Fuente : http://geeks.ms
No hay comentarios:
Publicar un comentario