Databinding Fecha: 29/Ene/2005 (29-01-2005)
|
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:
Fichero con el código de ejemplo: Marckys_Databinding.zip - 11,9 KB