1) tengo una columna que es checkbox y quiero que solo se realize un check
si solo si cumple una <condición> y
2) como validar que un valor ingresado en la grilla no supere una
<condicion>.
Se que este se puede hacer con el validating, pero no lo quiero validar
cuando salga de la fila, sino que lo quiero realizar en el instante, ¿se
puede?
Porque no lo realizo en validating?, la razon es que si no cumple una
validación y con el mouse presiono el boton de salir me despilega el mensaje
que dispuse para esa validación.
Para tu primera cuestión creo que podrías utilizar el evento CellFormatting
del grid, comprobando si la celda sobre la que se está produciendo el formato
corresponde a la columna que contiene los checkbox. En caso afirmativo,
utilizas la condición para aplicar el valor necesario a la propiedad ReadOnly
de la celda, de forma que habilites / deshabilites la posibilidad de marcar
la casilla del check. Algo parecido al siguiente código de ejemplo:
'/////////////////////////
Private Sub grdDatos_CellFormatting(ByVal sender As System.Object, ByVal e
As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles
grdDatos.CellFormatting
If Me.grdDatos.Columns(e.ColumnIndex).Name = "Discontinued" Then
If Me.grdDatos.Rows(e.RowIndex).Cells("UnitPrice").Value > 40 Then
Me.grdDatos.Rows(e.RowIndex).Cells(e.ColumnIndex).ReadOnly = True
End If
End If
End Sub
'/////////////////////////
Respecto a tu segunda pregunta, supongamos que no queremos que en la celda
de una cierta columna se puedan introducir números. Un modo de abordarlo
sería asignar a la propiedad KeyPreview del formulario el valor True y
declarar una variable a con visibilidad a nivel de clase para establecer
cuándo quieres controlar esta característica. Posteriormente, en los eventos
CellBeginEdit y CellEndEdit estableces la variable para controlar la edición
cuando vayas a editar la columna que necesitas.
Finalmente, en el evento KeyPress compruebas si la variable de control de
edición nos indica que podemos controlarla, y en caso afirmativo, verificamos
si el valor tecleado es un número. En caso de que así sea lo rechazamos
asignando al parámetro KeyPressEventArgs.KeyChar una cadena vacía, indicando
también al evento que nosotros vamos a controlarlo mediante
KeyPressEventArgs.Handled = True. Te adjunto también un bloque de código con
un ejemplo:
'/////////////////////////
Public Class Form1
Private bControlarEdicion As Boolean = False
'....
Private Sub grdDatos_CellBeginEdit(ByVal sender As System.Object, ByVal
e As System.Windows.Forms.DataGridViewCellCancelEventArgs) Handles
grdDatos.CellBeginEdit
If Me.grdDatos.Columns(e.ColumnIndex).Name = "ProductName" Then
bControlarEdicion = True
End If
End Sub
Private Sub Form1_KeyPress(ByVal sender As System.Object, ByVal e As
System.Windows.Forms.KeyPressEventArgs) Handles MyBase.KeyPress
If bControlarEdicion Then
If Char.IsDigit(e.KeyChar) Then
e.KeyChar = ""
e.Handled = True
End If
End If
End Sub
Private Sub grdDatos_CellEndEdit(ByVal sender As System.Object, ByVal e
As System.Windows.Forms.DataGridViewCellEventArgs) Handles
grdDatos.CellEndEdit
If Me.grdDatos.Columns(e.ColumnIndex).Name = "ProductName" Then
bControlarEdicion = False
End If
End Sub
End Class
'/////////////////////////
Espero que te sirva de ayuda.
--
Un saludo
Luis Miguel Blanco
http://www.dotnetmania.com
Te indico lo que dice la ayuda de Visual Studio respecto de la clase
DataGridViewCheckBoxCell:
[...]
Normalmente, los valores de celda de una casilla de verificación están
pensados para el almacenamiento, como cualquier otro dato, o para realizar
operaciones masivas. Si desea responder inmediatamente cuando los usuarios
hacen clic en una celda de una casilla de verificación, puede controlar el
evento DataGridView.CellClick, pero este evento se produce antes de que se
actualice el valor de la celda. Si necesita el nuevo valor en el momento del
clic, una de las opciones es calcular que el valor esperado se basará en el
valor actual. Otro enfoque es confirmar inmediatamente el cambio y controlar
el evento DataGridView.CellValueChanged para responder a él. Para confirmar
el cambio cuando se hace clic en la celda, debe controlar el evento
DataGridView.CurrentCellDirtyStateChanged. En el controlador, si la celda
actual es una celda de una casilla de verificación, llama al método
DataGridView.CommitEdit y pase el valor Commit.
[...]
Pero, ¡vamos! Que si no te quieres complicar mucho la vida, la idea ya te la
ha dado el compañero Luis Miguel Blanco: utilizar el evento «CellFormatting»
para verificar en él si se cumple la condición:
Private Sub DataGridView1_CellFormatting(...)
' Si el índice de la columna no pertenece
' a la columna tipo CheckBox, abandonamos
' el procedimiento.
'
If e.ColumnIndex <> 3 Then Return
' Referenciamos la celda tipo DataGridViewCheckBoxCell
'
Dim cb As DataGridViewCheckBoxCell = _
TryCast(Me.DataGridView1.CurrentCell, DataGridViewCheckBoxCell)
If cb IsNot Nothing Then
' Si se cumple la condición ...
If condicion Then
' ... hacemos Check en el control ...
cb.Value = True
' ... y lo hacemos de sólo lectura
cb.ReadOnly = True
Else
cb.ReadOnly = False
End If
End If
End Sub
> 2) como validar que un valor ingresado en la grilla no supere una
> <condicion>.
Si te refieres a que el texto de la celda no supere una determinada
longitud, en el evento «CellValidating» ejecutarías lo siguiente:
Private Sub DataGridView1_CellValidating(...)
' Obtenemos el control de texto de la celda
' actualmente en edición.
'
Dim tb As TextBox = _
TryCast(DataGridView1.EditingControl, TextBox)
If (tb IsNot Nothing) AndAlso (tb.Text.Length > 10) Then
MessageBox.Show("El texto supera la longitud.")
' Cancelamos el evento
e.Cancel = True
End If
End Sub
--
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.