Databinding
Error al enlazar checkBox y radioButton

Fecha: 29/Ene/2005 (29-01-2005)
Autor: Marckys - Marc Rubiño (sdimars@maptel.es)

 


Un error que nos encontraremos siempre que  queremos enlazar un checkBox o radioButton en un formulario, es que al intentar insertar nuevos datos con CurrencyManager no avanzara al nuevo registro.

Esto tiene una fácil solución, pero primero mostraré como hacer el enlace y luego mostraré las soluciones a los problemas que nos podemos encontrar.

Formulario con los datos enlazados

Bueno lo primero que tenemos que hacer para enlazar es crear un CurrencyManager para controlar la posición y el enlace de los datos.

//DataSet cargado desde un archivo XML.

      private DataSet Datos;

      private CurrencyManager cm;

 

Seguidamente ya podemos enlazar los controles a los datos.

 

private void Enlazar()

{

    //Enlazamos los datos al documento

    textBox1.DataBindings.Add("Text", Datos, "Usuarios.DNI");

    textBox2.DataBindings.Add("Text", Datos, "Usuarios.Nombre");

    textBox3.DataBindings.Add("Text", Datos, "Usuarios.Direccion");

 

    checkBox1.DataBindings.Add("Checked", Datos, "Usuarios.Pagado");

    checkBox2.DataBindings.Add("Checked", Datos, "Usuarios.Entregado");

 

    comboBox1.DataBindings.Add("SelectedItem", Datos, "Usuarios.Pago");

 

    radioButton1.DataBindings.Add("Checked", Datos, "Usuarios.Rojo");

    radioButton2.DataBindings.Add("Checked", Datos, "Usuarios.Azul");

    radioButton3.DataBindings.Add("Checked", Datos, "Usuarios.Amarillo");

     

    //Enlazamos el currencymanager

    cm = (CurrencyManager)this.BindingContext[Datos,"Usuarios"]; 

}

  

   

Una vez enlazados todos los controles y cargados los datos, ya podemos crear los botones de navegación.

 

 

private void button1_Atras(object sender, System.EventArgs e)

{

      //Retrocede una Posición

      cm.Position -= 1;

      CalcularPosicion();

                 

}

 

private void button2_Adelante(object sender, System.EventArgs e)

{

      //Avanza una Posición

      cm.Position += 1;

      CalcularPosicion();

           

}

private void CalcularPosicion()

{

      //Calcula la posición y lo mostramos en el textBox

int iCnt;

      int iPos;

      iCnt = cm.Count;

      iPos = cm.Position + 1;

 

      textBox4.Text =  iPos.ToString() + " de " + iCnt.ToString();

 

}

private void button3_Añadir(object sender, System.EventArgs e)

{

      //Añade un nuevo registro

      cm.AddNew();

      CalcularPosicion();

}

 

private void button4_Borrar(object sender, System.EventArgs e)

{

//Elimina el Registro en la posición actual

      cm.RemoveAt(cm.Position);

      CalcularPosicion();

}

 

private void button5_Guardar(object sender, System.EventArgs e)

{

      //Guarda los datos en el archivo de origen XML

      cm.EndCurrentEdit();

      Datos.WriteXml("Datos.xml");

}

 

Bueno hasta aquí todo funciona perfectamente, pero el problema viene cuado intentamos insertar un nuevo registro, y el CurrencyManager no avanza hasta la nueva posición.

Este problema ocurre porque los controles como checkBox no pueden contener valores nulos y al intentar crear un nuevo registro provoca el error.

La solución es muy sencilla, cuando enlazamos los controles a los datos les indicamos un valor por defecto y al crear los datos nuevos siempre se mostraran con los valores por defecto.

private void Enlazar()

{

    checkBox1.DataBindings.Add("Checked", Datos, "Usuarios.Pagado");

    //Valor por defecto en el Dataset

    Datos.Tables["Usuarios"].Columns["Pagado"].DefaultValue = "False";

                 

    checkBox2.DataBindings.Add("Checked", Datos, "Usuarios.Entregado");

    //Valor por defecto en el Dataset

    Datos.Tables["Usuarios"].Columns["Entregado"].DefaultValue = "False";

                 

    radioButton1.DataBindings.Add("Checked", Datos, "Usuarios.Rojo");

    //Valor por defecto en el Dataset

    Datos.Tables["Usuarios"].Columns["Rojo"].DefaultValue = "False";

 

    radioButton2.DataBindings.Add("Checked", Datos, "Usuarios.Azul");

    //Valor por defecto en el Dataset

    Datos.Tables["Usuarios"].Columns["Azul"].DefaultValue = "False";

 

    radioButton3.DataBindings.Add("Checked", Datos, "Usuarios.Amarillo");

    //Valor por defecto en el Dataset

    Datos.Tables["Usuarios"].Columns["Amarillo"].DefaultValue = "False";

 ...

Con esta modificación ya podremos insertar nuevos registros automáticamente.



Espero que este pequeño ejemplo os sirva para algo, si es así votar por el.

Gracias.

 


Espacios de nombres usados en el código de este artículo:

 


ir al índice

Fichero con el código de ejemplo: Marckys_Databinding.zip - 11,9 KB