Visual Studio .NET 2003
Visual basic :NET
Estoy utilizando un CheckedListBox enlazado a un datatable para llenarlo,
este datatable tiene un campo BOOLEANO que sirve para marcar la casilla de
verificación (el campo 3), despues de enlazarlo lo recorro para marca o no
marcar la casilla correspondiente:
Dim r As DataRow
Dim i As Byte
For Each r In dt.Rows
If r(3) Then
Me.chklist.SetItemCheckState(i, CheckState.Checked)
Me.chklist.SetItemChecked(i, True)
End If
i += 1
Next
Bien, en teoría deberían quedar marcadas "algunas" casillas del
CheckedListBox, ¿estoy en lo cierto?
Todo este proceso se realiza desde el NEW, es decir al crear la instancia
del WinForm, en el constructor, pues bien, ENTRA en el IF, los dos métodos
se ejecutan PERO NO "SE PINTA" las casillas de verificación ¿por qué?, ¿qué
estoy haciendo mal?
Si este mismo proceso (de enlazar al datatable y recorrer para marcar) lo
realizo en el LOAD o desde un evento si se pinta la marca de verificaión.
?¿?¿?¿?¿?¿, ¿alguna solución?
Mil gracias de antemano
Sí. Ejecutar el código en el evento «Load» del formulario, que se supone se
ejecutará una vez que se hayan ejecutado el procedimiento
«InitializeComponent» y el constructor de la clase «Sub New ()», de hecho,
si los ejecutas en dicho evento, tú mismo has comprobado que sí "se pinta".
Pero si el bucle lo ejecutas en el constructor, puede ser que posteriormente
se inicialice de nuevo el componente «CheckedListBox» al ejecutarse el
procedimiento «InitializeComponent».
Procura que la primera línea de ejecución de cualquier constructor que tenga
el formulario, sea una llamada al procedimiento «InitializeComponent».
Un saludo
--
Enrique Martínez
[MS MVP - VB]
Nota informativa: La información contenida en este mensaje, así como el
código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin
garantías de ninguna clase, y no otorga derecho alguno. Usted asume
cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o
sugerido en el presente mensaje.
"Procura que la primera línea de ejecución de cualquier constructor que
tenga
el formulario, sea una llamada al procedimiento «InitializeComponent»."
Así lo tengo, luego viene el resto de la "inicialización". Todo dentro del
NEW
En el constructor:
«InitializeComponent».
Enlanzar datos
Recorrer lista para marcar casillas
-> Resultado -> NO "pinta" las casillas de verificación
Por supuesto en el LOAD o en cualquier otro sitio (después de crearse "la
clase") si funciona.
¿No es posible realizar este tipo de "operaciones" en el constructor?
> Así lo tengo, luego viene el resto de la "inicialización". Todo dentro del
> NEW
>
> En el constructor:
> «InitializeComponent».
> Enlanzar datos
> Recorrer lista para marcar casillas
>
> -> Resultado -> NO "pinta" las casillas de verificación
>
> Por supuesto en el LOAD o en cualquier otro sitio (después de crearse "la
> clase") si funciona.
>
> ¿No es posible realizar este tipo de "operaciones" en el constructor?
Me he entretenido en realizar una prueba, siguiendo los mismos pasos que has
indicado, y la verdad es que no he tenido ningún problema para "pintar" las
casillas de verificación del control CheckedListBox en el constructor del
formulario que contiene a dicho control, por supuesto, una vez ejecutado el
procedimiento «InitializeComponent».
Haz una prueba, estableciendo un punto de interrupción en el constructor
después de recorrer la lista, y continúa la ejecución del código pulsando la
tecla F8. Te lo comento mayormente para que compruebes si en otra parte del
formulario se vuelve a inicializar el control CheckedListBox, o bien, se
establece a «Nothing» el valor del parámetro «DataSource» del control:
Me.CheckedListBox1.DataSource = Nothing
Si no es así, ignoro a qué puede deberse.