20 septiembre 2007

Problemas usando un BindingNavigator

En los últimos 2 días me he encontrado con 2 problemas curiosos relacionados con los enlaces a datos (DataBinding).

En primer lugar, tenemos en FFactura dos listas, una de Documentos y otra de Lineas, que son dos propiedades de las facturas. Tenemos un bind principal que contiene una Factura, y luego otros bindDocumentos y bindLineas enlazados al primero en tiempo de diseño. El bind principal lo rellenamos de dos formas: si nos pasan una única factura, hacemos un Clear() y un Add() de ese objeto. Si nos pasan una colección, la establecemos en Datasource y asignamos su Position. En el primer caso, las listas de documentos y líneas funcionaban correctamente. En cambio, en el segundo caso ambas listas salen vacías: se muestran las filas, pero las celdas no muestran datos, están en blanco. Compruebo además que el grid no pide los valores (interceptando el GetValue de PropertyDescriptorInterior, por donde no pasa).
No hemos conseguido descubrir a qué se debe, pero lo hemos solucionado evitando el enlace de Documentos y Lineas en diseño, y haciéndolo en el CurrentChanged del bind principal, asignando como Datasource la colección concreta de la factura seleccionada.
Este problema no está provocado por el BindingNavigator, pero indirectamente sí, ya que la utilización de una colección en lugar de una factura individual es para poder navegar.

El segundo problema se refiere directamente a un navigator: al cargar una factura desde una colección, cuando nos movemos a la factura siguiente, se produce el error 'La propiedad Centro es de sólo lectura'. Las facturas no son modificables, y al movernos en el binding se está disparando automáticamente un EndCurrentEdit que provoca una escritura de los valores de los controles sobre las propiedades de negocio. No debería hacerse, pero se hace porque el estado actual de la fila en el binding indica que está cambiada (aunque esto no puedo comprobarlo). Veo en The Scripts que esto suele suceder al enlazar un BindingNavigator a objetos de negocio, que la causa realmente es del BindingSource, y que es un comportamiento que parece pensado para bases de datos. Aunque no lo entiendo, puesto que si al cambiar un control se actualiza directamente sobre el origen de datos, no tiene por que hacerse de nuevo al final de la modificación y sin ninguna comprobación (hala, a saco, escrito todas las propiedades porque yo lo valgo que soy el binding). La solución que dan en el foro a esto es extender el BindingNavigator para que antes de movernos cancelemos la edición pendiente. Pero a mí me gusta ir a la raíz del problema: ¿por qué hay una edición pendiente?
De momento no voy a solucionar esto hasta que encuentre a qué se debe.

Etiquetas: