Mantener actualizados unos ComboBox

Vamos con una de programación, que hace mucho que no cuento nada (básicamente, porque llevo unos meses sin programar; a ver si arranco motores). Me he puesto con mi aplicación de anime (un front-end para una base de datos de series, nada más, que me sirve de aprendizaje y experimentación). Ya me toca meter datos, sacar fallos, pulir el funcionamiento y terminar algunas funciones pendientes. Y recordar lo que estaba haciendo, que hace seis meses o así que no la tocaba.

Una de estas funciones, o funcionalidades, si lo preferís para no confundirlo con functions, es la de mantener actualizados una serie de comboboxes que hay en el formulario principal de las series. Estos comboboxes contienen los datos de una serie de tablas de la base de datos que se caracterizan por tener pocos datos: el formato de archivo, la resolución, el códec de vídeo… En otras circunstancias, los rellenaría usando mi clase RellenarCombo, pero aquí se me presenta un problema curioso: como podéis ver en la imagen, hay una buena cantidad de comboboxes (una docena o así) que se corresponden a una serie de campos de las Releases (versiones) de una serie. El formulario muestra conjuntamente las series y sus releases, estando en la parte superior los datos de la serie y en la inferior, en cero o más pestañas los datos de las releases. O sea, tengo una docena de combos por cada pestaña.

Aquí empezaron mis problemas: ¿cómo rellenar esos combos y mantenerlos actualizados?

Lo primero que pensé fue no utilizar combos. En lugar de traerme los datos de las Releases (tabla) y ligarlos al ValueMember de cada combo, podía crearme una consulta que englobara la tabla de Releases y las tablas relacionadas. A la hora de modificar datos sí tendría que mostrar los combos y trabajar con la tabla de Releases, lo que me añadiría bastante complicación al código. Este sistema, más o menos, es el que estoy siguiendo en una aplicación para fábrica donde la modificación de los datos será mínima.

Otra opción era rellenar cada combo por su cuenta. En principio, lo normal sería tener sólo una release por serie, esto es, una pestaña, siendo tres o cuatro el número máximo. Así pues, podría hacer la carga del combo, digamos, de Tipo de archivo, una vez para cada pestaña. Esto no me gustaba por varias razones: la primera es la redundancia de datos en memoria. Si tengo tres veces el mismo ComboBox en el formulario (en tres pestañas) he cargado tres datatables para ligarlas a estos combos. La segunda es que a la hora de mantener esos datos actualizados (por ejemplo, si añado un nuevo tipo de archivo) tendría que comprobar cuántas pestañas hay y volver a cargar cada tabla ligada a cada combobox. Si tengo tres pestañas, el trabajo por tres. Y la tercera y más importante: no me parecía elegante.

Así que opté por cargar todos esos datos en memoria y que los combos de las distintas pestañas, independientemente de cuántas pestañas hubiera, se sirvieran de ellos. Como mucho, unos doscientos registros formados por dos campos: un valor numérico (clave primaria, a ligar al ValueMember) y una cadena de caracteres (el campo descriptor que se mostrará en el combo). Para trabajar con ello creé una clase muy sencilla que contuviera esos valores. En su forma más simple:

Public Class IdMasDescripcion
    Private _Id As Integer
    Private _Descripcion As String
    Public Sub New(ByVal Id As Integer, _
                   ByVal Descripcion As String)
        _Id = Id
        _Descripcion = Descripcion
    End Sub
    Public Sub New()

    End Sub
    Public Property Id() As Integer
        Get
            Return _Id
        End Get
        Set(ByVal value As Integer)
            _Id = value
        End Set
    End Property
    Public Property Descripcion() As String
        Get
            Return _Descripcion
        End Get
        Set(ByVal value As String)
            _Descripcion = value
        End Set
    End Property
End Class

Luego me declaré una serie de colecciones de IdMasDescripcion, digamos que unas List (of IdMasDescripcion). Al arrancar la aplicación y realizar la carga de datos, rellenos estas colecciones con los datos de las tablas respectivas. Luego, en el procedimiento que controla las pestañas, cuando se crea una, ligo cada colección a su ComboBox correspondiente (mediante su DataSource, etc.) y listo.

Bueno, listo, no. Ahora viene controlar que se muestren los datos actualizados en esos combos. Si, digamos, yo añado un nuevo tipo de archivo, la aplicación lo detecta y vuelve a rellenar la List(of T) correspondiente a esta tabla, los combos ya existentes no muestran los cambios. Oh, vaya.

La solución es muy simple: la colección elegida no es la adecuada para esto. Si cambiamos la List(of T) por una BindingList(of T), problema solucionado.

En resumen: vuelco los datos que necesito de una tabla de la base de datos a una BindingList. Enlazo todos los comboboxes que vayan a mostrar esos datos (uno por pestaña, vaya) a la BindingList y puedo mantenerlos todos actualizados para cuando vaya a modificar una release. Ahora que lo veo así, resulta evidente, pero en su momento me llevó bastante caer en ello.

No me da tiempo a más. Si alguien quiere que ponga el código completo (aunque no es nada del otro mundo, la verdad), pues me lo pide y lo subo en cuanto pueda.

Nos vemos en el Forlon.

Deja un comentario