Colaboraciones en el Guille

DataBinding de Controles CheckBox en Aplicaciones Smart Device

 

Fecha: 20/Sep/2005 (11/09/2005)
Autor: Antonio de Rojas (aderojas@wanadoo.es)

 


A la hora de realizar el databinding de los controles de un formulario construido con Compact Framewotk se siguen los mismos pasos que para su hermano mayor, el .Net Framework. Sin embargo, para algunos controles existen excepciones. Uno de esos controles es el CheckBox.
Cuando intenté realizar el binding de un CheckBox con mi origen de datos seguí el proceso "lógico", pero inesperadamente me encontré que no funcionaba como yo esperaba. Busqué en los grupos de noticias y encontré la solución que aquí expongo, principalmente con el fin de evitar que otros muchos pierdan el tiempo como yo lo hice. Al fin y al cabo con Compact Framework no siempre lo "lógico" es lo que funciona.

Realizando el databinding "lógico"

La forma inicial de realizar un databinding con un control CheckBox dentro de un formulario suele ser la siguiente:

Dim dtTabla As DataTable = dsDataSet.Tables("MiTabla")
chkCheckBox.DataBindings.Add("checked", dtTabla, "MiCampo")
dtTabla.Columns("MiCampo").DefaultValue = "False"

Además, como se aprecia en las líneas de código anteriores es necesario establecer el DefaultValue, ya que en caso contrario obtendremos un error cuando intentemos insertar un registro en el formulario. Esto es debido a que los CheckBox no admiten valores nulos.
Este código funciona perfectamente en .Net Framework, pero no lo hará correctamente en Compact Framework, ni siquiera en la beta correspondiente a la versión 2.0. La razón es que el evento CheckChanged no existe en Compact Framework y por tanto el origen de datos no se actualizará cuando marquemos o desmarquemos el CheckBox. Esto provocará por supuesto que el método HasChanges del DataSet siempre devuelva True, a pesar de haber actualizado correctamente con un Update el origen de datos.

Realizando el databinding que funciona

La solución, algo más compleja, se presenta en las siguientes líneas de código

Dim dtTabla As DataTable = dsDataSet.Tables("MiTabla")
Dim oBinding As Binding
oBinding = New Binding("CheckState", dtTabla, "MiCampo")
AddHandler oBinding.Format, AddressOf StatusToCheckState
AddHandler oBinding.Parse, AddressOf CheckStateToStatus
chkCheckBox.DataBindings.Add(oBinding)

' Métodos para los Binding de los CheckBox.
Protected Sub StatusToCheckState(ByVal Sender As Object, ByVal e As ConvertEventArgs)
    If e.Value = True Then
        e.Value = CheckState.Checked
    Else
        e.Value = CheckState.Unchecked
    End If
End Sub

Protected Sub CheckStateToStatus(ByVal Sender As Object, ByVal e As ConvertEventArgs)
    If e.Value = CheckState.Checked Then
        e.Value = True
    Else
        e.Value = False
    End If
End Sub

Realizamos el databinding con la propiedad CheckState del CheckBox. Se capturan los eventos Format y Parse del objeto Binding con el fin de realizar las transformaciones necesarias que nos permitan marcar y desmarcar el CheckBox, y que al mismo tiempo nos permita actualizar el origen de datos.
Con Format aplicamos un determinado formato para su vista en el formulario, y esto lo hacemos a través del método StatusToCheckState. Y con Parse, recuperamos el valor formateado y aplicamos los cambios necesarios para obtener el valor deseado. En este caso empleado el método CheckStateToStatus.

Espero que con éstas pocas líneas de código se pueda evitar algún que otro quebadero de cabeza.


 

ir al índice principal del Guille