miércoles, 30 de abril de 2008

Visual Studio 2005 - Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

Una vez me estaba loco buscando hacer un formulario simple para manejar datos del registro de un estudiante en .Net en el cual se manejaba datos de departamento y municipio para establecer el lugar de domicilo. El formulario era simple, datos como nombre, apellido...bla..bla y una referencia a la tabla municipio para relacionar a un estudiante con un municipio de domicilio. Hasta aqui facil, el registro de los datos era sencillo. El problema se presento al momento de editar la ubicacion del estudiante, pues la aplicación lanzaba error. Aqui esta el modelo de datos algo reducido para tomarlo de ejemplo.




El formulario tendria mas o menos estos campos base

El registro era sencillo, pero al momento de actualizar presentaba un error algo como "Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.", pantallazo es el siguiente.


y por si depronto esta haciendo algo parecido a esto y esta usando un Update Panel del AjaxControlToolKit se te puede prensentar una alert como este


Despues de revizar mil y un veces el formulario encontre que el problema era que como los DropDownList estaban enlazados los datos del estudiante, cuando modificaba Drop del departamento este modificaba el Drop de municipios y el valor que en ese instante estaba registrado al estudienta en el campo idMunicipioUbicacion no se encontraba en la nueva lista de municipios, lanzando los errores anteriormente mencionados. Luego de buscar por la web encontre la solucion en la pagina webswapp . y la modifique de manera que pudiese adaptar para DropDownList que estuviesen en cascadas de dos niveles.

El truco consisten en que en la edicion solo se enlaza el contro del DropDown del departamento empleando Eval, quedando algo como Eval("DepartamentoId") en vez de usar Bind("DepartamentoId"). Asi al momento del evento updating que tiene lugar en el Object Data Source asignamos el valor seleccionado en el control de manera manual quedando algo asi

protected void ODS_Fv_Updating(object sender, ObjectDataSourceMethodEventArgs e)
{
e.InputParameters["idMunicipioUbicacion"] = ObjFormulario.GetValueFromDrop(Fv, "Ddl_Municipio");
}

Aqui les dejo los archivos para que los descargen: Base de datos y el Proyecto TestForBlog . Actualmente estoy trabajando en un formulario de estudiante que emplea tres niveles que son Departamento>>Municipio>>Zona en el cual si la en la ultima, Zona no se se encuentra en la lista la puede ingresar de manera dinamica en el mismo formulario, si alguien tiene un problema parecido o que involucre tres niveles en una cascada me deja el comentario para subir el ejemplo.


No hay comentarios: