05 abril 2006

Un combo sobre objetos de negocio

Esta vez no me ha dado tiempo a anticiparme, y el desarrollo me ha pillado sin tener prevista una solución para el rellenado de combos desde objetos de negocio. Intentaré ser rápido:

Aquí va un ejemplo de un artículo donde se desarrolla un combo personalizado que puede ser borrado (NullableComboBox). Es muy interesante para las relaciones que sean opcionales, pero también nos sirve el ejemplo para ver cómo se conecta el contenido del combo con una IList que contendrá objetos de negocio.
Tenemos dos casos de uso del combo, y con esto que he contado solventamos el primero: rellenar datos desde una colección de objetos de negocio. El segundo es cuando los datos vienen de un enumerado. Para este caso se me ocurre crear una colección de pares KeyValuePair, como un diccionario (quizá con un diccionario mismamente), y vincular como origen de datos las dos propiedades que ofrece, Key y Value. Como el método que nos devuelve esta colección (que debe guardarse en caché, crearse una vez y reutilizarse después) no puede incluirse en el Enum, podemos ponerlo como estático en la clase que principalmente usa el enumerado (en el caso de TratamientoIVA podemos ponerlo en ECliente, por ejemplo).

Como curiosidad os cito también un artículo de CodeProject (qué buenos artículos hay ahí) sobre un ImageCombo, que no existe en .net, pero que se implementa muy fácilmente y con mucho provecho (joder, parezco Cervantes).

Y por último, una línea de investigación que dejo abierta: me surge a partir de una pregunta sobre el formateo y el reconocimiento (parse) de valores de negocio en un textbox (por poner un ejemplo) a través de un enlace a datos (DataBinding). Cubre las dos direcciones, el formateo (sincronización del control con los datos del objeto de negocio) y el parse (actualización del objeto de negocio con los cambios hechos en el control), y es muy interesante para ver cómo formatear números y fechas, cómo comprobar que un número es válido antes de asignarlo al objeto... Como os digo todo esto me surge a partir de una pregunta, hay que tirar del hilo y buscar la documentación necesaria para conocer bien cómo funcionan los eventos Convert (Format y Parse) del Binding, y qué es y cómo funciona un BindingContext.

1 Comments:

Blogger Pablo said...

Hasta estudiar mejor el tema del NullableComboBox, de momento usando un Combo normal ya hemos conseguido el enlace (Databinding) con una propiedad de un objeto de negocio que apunta a otro objeto. Ha quedado muy bien rellenando el DataSource con una lista (EColBase) de los objetos que deben listarse en el combo, y enlazando SelectedItem (ojo, no SelectedValue) con la propiedad del objeto de negocio. Para que funcionara esto nos faltaban un detalles: cuando el databinding asigna la propiedad del objeto al SelectedItem del combo, éste la compara con los Items de la lista del combo (que vienen del DataSource). Por eso necesitamos redefinir Equals() en EBase, para comparar que los tipos reales de los objetos sean iguales y sus Id también. La definición de Equals() en Object sólo compara que sean el mismo objeto en memoria (punteros iguales).
Ha quedado muy bien, digo, porque la primera aproximación era enlazar SelectedValue, que contendría el Id seleccionado en el combo, pero entonces no podíamos enlazar directamente con obj.Propiedad sino que teníamos que crear un obj.PropiedadId de lectura y escritura. Esto no ha sido necesario usando SelectedItem, y además evitamos la creación de nuevas instancias, ya que asignamos al objeto la misma instancia de la lista.
Y ahora qué falta:
1. Rellenar un combo con los valores de un enumerado (no un EColBase). Probaremos con TratamientoIVA.
2. Crear un control (seguramente no un combo) que sirva para seleccionar objetos de tablas grandes (como clientes), donde es lento rellenar el combo y difícil para el usuario buscar ahí. Se necesita la ayuda de un buscador auxiliar.

07 abril, 2006 08:32  

Publicar un comentario

<< Home