Jugando con colecciones Dictionary

Esta entrada podría valer como la tercera de la serie “Mantener actualizados unos ComboBox”, pero va en modo corto, que es nochebuena y me dan ganas de hacer algo más acorde con la fecha (ver La tumba de las luciérnagas, por ejemplo). Hagamos un breve resumen: tenemos un formulario maestro-detalle de series y las releases o distintas versiones de esas series. Como el número de releases por serie es pequeño (0 a 3 ó 4) y el número de campos de la tabla releases es amplio, en lugar de usar una rejilla o algún control parecido, decidí emplear un TabControl que mostrara tantas pestañas como releases y, en cada una, un UserControl con todos los datos. Es decir, esto:

Cada ComboBox del UserControl muestra el contenido de otra tabla (sí, son unas cuantas). Podría haber dejado los combos sólo para altas y modificaciones y haber usado una consulta más específica en lugar de traerme la tabla releases a capón, pero aquí no me gustó la idea (en otra aplicación con un problema parecido es lo que hice; claro, que también usaba SQL Server y pude crear una vista). En lugar de eso, aprovechando que todas esas tablas tienen (y tendrán) un pequeño número de registros (menos de veinte), decidí cargar todos esos datos en memoria. Bueno, no todos, sólo la clave primaria y el campo a mostrar en el ComboBox. Para ello hice una clase sencilla y una BindingList personalizada con métodos de ordenación específicos. También una enumeración con todas las tablas.

Junté todo en una colección tipo Dictionary. Sus pares de valores eran el valor de la enumeración (que identifica la tabla) y la BindingList personalizada con el conjunto de datos de la tabla. Ahora sólo queda pasar ese Dictionary a cada UserControl y que éste enlace cada ComboBox a la BindingList correspondiente. ¿Cómo? Pues, por ejemplo, creando otro Dictionary que para cada tabla (valor de la enumeración) tenga el ComboBox correspondiente. Así:

Private _MisCombos As New Dictionary(Of enTablas, ComboBox)

Y en el constructor del UserControl:

With _MisCombos
    .Add(enTablas.Fansub, cboFansub)
    .Add(enTablas.Subtitulos, cboSubtitulos)
    .Add(enTablas.Archivador, cboArchivador)
    .Add(enTablas.Video, cboCodecVideo)
    .Add(enTablas.Audio, cboCodecAudio)
    .Add(enTablas.Valoracion, cboRValoracion)
    .Add(enTablas.TipoArchivo, cboContenedor)
    .Add(enTablas.Soporte, cboSoporte)
    .Add(enTablas.Calidad, cboCalidad)
    .Add(enTablas.Resolucion, cboResolucion)
End With

Lo siguiente es pasarle al UserControl el Dictionary con el contenido de las tablas, ya sea mediante una propiedad, un método o un constructor con parámetros. Supongamos que a ese Dictionary lo llamamos _LoQueHayEnLosCombos. Recordemos: ese Dictionary está formado por la enumeración de las tablas, enTablas, y por la BindingList personalizada, lista de una clase con dos propiedades, Id y Descripcion. Ya con todo eso junto, el enlace de cada combo con su tabla correspondiente se puede hacer así:

'Y, ahora, la magia:
For Each Combo As KeyValuePair(Of enTablas, ComboBox) In _MisCombos
    Combo.Value.DataSource = _LoQueHayEnLosCombos(Combo.Key)
    Combo.Value.DisplayMember = "Descripcion"
    Combo.Value.ValueMember = "Id"
Next

En fin, un ejemplo un poco tonto de cómo relacionar colecciones mediante Dictionary que compartan la misma Key. Si a alguien le sirve de algo, como siempre, me alegro.

Deja un comentario