none
Control usuario colocar item ComboBox antes de Load RRS feed

  • Pregunta

  • Hola:

    Estoy migrando un control de usuario de vb6 a vb.net 2010. El control tiene dos combos y el problema surge porque antes del evento Load que es donde relleno los Item suceden algunos eventos que dan error al no estar todavía colocados dichos Item.

    En vb6 había un método Initialize que permitía situar y rellenar todos los controles en el UserControl antes de que sucedieran otros eventos.

    Cuando voy al designer hay un InitializeComponent donde aparece el nombre de los dos combos vacíos y me dice que no toque el código, que lo haga desde el diseñador de Forms. Para ello no encuentro otra posibilidad que Load en los eventos asociados de una larga lista sin que encuentre algo parecido a Initialize.

    Agradeceré a quien me pueda orientar sobre el método para situar y "resizar" en su caso los controles antes de que se cargue (Load) el UserControl y se produzca otro evento.

    Saludos al grupo,
    J. Enrique Alcaraz, Madrid - España

    lunes, 13 de septiembre de 2010 19:43

Respuestas

  • Bueno, pues de nuevo aquí para rectificar lo anterior, y es que el evento Resize se produce antes de colocar los controles con Initialize. Si bien el sub New es lo primero que se produce, luego salta a Initialize, luego a controles declarados, luego directamente a resize, luego vuelve a Initialize de nuevo y empieza a colocar los controles de código. Es decir, parece ser  que el evento resize se produce al añadir el form del control del diseño visual y resizarse a su tamaño con lo cual el evento micontrol_resize da error al no estar creados todavía los 48 label a los que hace referencia.

    Seguiré agradeciendo sugerencias para evitar que el evento resize se produzca antes de colocar todos los controles. No sé qué puedo estar haciendo mal pero estoy pensando en eliminar el resize y hacer un ajuste a resolución de pantalla con código en el evento Load, aunque repito que en el usercontrol actual de vb6 no existía este problema.

    Otra cosa que se me ocurre sobre la marcha es crear todos los controles desde 0 incluido el form y los combos sin diseñador visual ninguno, luego darles un size con código una vez colocados pero no sé si es posible en vb.net. En realidad solo tengo en diseño muy poco, un form cuadrado de 200x200 y dos combos, los 48 label restantes los creo con código.

    ...

     

     

    martes, 14 de septiembre de 2010 20:34

Todas las respuestas

  • hola

    dentro del InitializeComponent() esta claro que no es buena idea ingresar codigo ya qeu este es generado por el propio VS

    pero no has probado usando el constructor de control que estas creando, o sea el  Sub New()

    por ahi luego de InitializeComponent, podrias agregar el codigo de carga de los controels que necesitas

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 14 de septiembre de 2010 3:41
  • Muchas gracias de nuevo, Leandro.

    Me imagino que se trata de poner un módulo, algo así

    Public Sub Main()
    Dim f As New frmPrincipal()
    f.Show()
    Application.Run(frmPrincipal)
    End Sub

    Pero lo que he observado antes de poner código es que el evento Load del formulario principal se sigue cargando antes del Main del módulo, y al Main ni caso (¿hay que importar algo en el módulo de Main? pongo main con minúscula y no lo devuelve con mayúscula como que no lo reconoce). Pensaba que si empezaba con el Main estaba salvado.

    Tengo poca experiencia con lo del new, ya digo que este problema no sucedía con el método initialize antiguo. Claro, de lo que no tengo ni idea es dónde construyo los controles (son 48 label partiendo de 0) y dónde relleno los Items de los dos combos que para cuando suceda el Load o el Show ya tienen que estar todos en su sitio. Curiosamente hay un Resize que sucede antes del Load y tambien Controadded, estoy probando con e y control.name pero no está dando resultado.  Estoy muy perdido pero de todas formas agradezco la ayuda aunque no paro de documentarme con libros y eso y me está costando mucho migrar desde vb6, es todo muy distinto aunque creo que una vez lo aprenda será mejor.

    Saludos al grupo,
    J. Enrique Alcaraz, Madrid - España

     

    martes, 14 de septiembre de 2010 9:16
  • Hola J. Enrique,

     

    En el UserControl que estás desarrollando,  me imagino que en el código tendrás algo asi:

     

    public sub New()

    InitializeComponent()

    end sub

     

    Podrías insertar tu código justo debajo de InitializeComponent.

    Esto se produce antes que el Load del control.


    Para el correcto funcionamiento, y que otros usuarios se puedan beneficiar de la solucion de esta pregunta por favor marca las respuestas que te hayan ayudado como "Respuesta".
    Si la respuesta te ha sido util Votala.
    Mi Blog: Jtorrecilla
    Enlace a Faq de Winforms en Ingles Muy bueno
    martes, 14 de septiembre de 2010 9:20
    Moderador
  • Hola:

    Pues no, no tenía ese código en mi user control, tenía Options..., Imports..., <icono>_ Public Class miUserControl, declaraciones de variables  y luego directamente Private Sub miUserControl_Load. Y el único InitailizeComponent() estaba en el designer pero eso no se puede cambiar.

    He puesto esas lineas de código que me dices antes del Load y por fin he comprobado con puntos de interrupción o con msgBox que se producen antes de Load y el control (todavía incompleto) sigue funcionando en el test.
    También he comprobado que si pongo las mismas líneas en un módulo aparte me da error y no reconoce InitializeComponent.

    Muchas gracias porque creo que ya he encontrado un comienzo antes del Load. Espero funcione cuando le traslade lo que hay ahora en Load.

    Saludos al grupo,
    J. Enrique Alcaraz, Madrid - España

    martes, 14 de septiembre de 2010 10:27
  • hola

    alli donde indica jtorrecilla es donde hacia referencia en le mensaje anterio, o sea en el constructor del UserControl, justo debajo del InitailizeComponent()

    si pones alli tu codigo no se ejecuta en el orden que buscas ?

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    martes, 14 de septiembre de 2010 13:04
  • Hola:

    En primer lugar disculpar mi demora al contestar, pues en realidad puedo dedicar poco tiempo a la programación, en mi tiempo libre y en fines de semana aunque llevo ya más de 10 años haciéndolo, cuando vb6 salió a finales de los 90. No soy profesional de esto pero durante estos años he confeccionado un gran programa para la gestión integral de mi propia empresa con muy buenos resultados. Quiero ponerme al día en vb, creo que vb.net es un gran proyecto, pero en mi caso calculo que me puede llevar algunos meses volcar la aplicación. También soy nuevo en este foro aunque vengo del desaparecido public.es.vb. En breve ampliaré un poco mi perfil...

    Volviendo al tema que me parece de gran interés para los que construyan controles de usuario, lo que he empezado a ver es que también en el Sub New > InitializeComponent, al poner los Item en los combos se sigue generando el evento SelectedIndexChanged, pero he descubierto una nueva propiedad para que no se genere que es SelectedValue = Nothing. Ahora solo me falta volcar a initialize la generación de los 48 label. También quiero recordar que uno de los combos tiene 200 item, lo que hago con un bucle For, esto no lo podría hacer desde propiedades >Items.
    De todas formas ha sido un gran loggro que el sub new Initializecomponents se produzca antes del resize por ejemplo.

    En resumidas cuentas, lo que yo quería desde un principio es que mediante código los controles estén ya dibujados en el UserControl antes de que se produzcan otros eventos, algo así como cuando se ponen los item de los combos directamente en la ventana de propiedades "Items" sin producir eventos.
    Una de las cosas que más me han gustado de .net es que se pueden crear controles desde 0 (Me.controls.add), mientras que en vb6 había que dibujar al menos uno...

    Seguiré con mi userControl y os informaré de cualquier novedad de interés aunque seguiré agradeciendo cualquier nueva orientación sobre lo dicho.

    Saludos al grupo,
    J. Enrique Alcaraz, Madrid - España

     

    martes, 14 de septiembre de 2010 19:07
  • Bueno, pues de nuevo aquí para rectificar lo anterior, y es que el evento Resize se produce antes de colocar los controles con Initialize. Si bien el sub New es lo primero que se produce, luego salta a Initialize, luego a controles declarados, luego directamente a resize, luego vuelve a Initialize de nuevo y empieza a colocar los controles de código. Es decir, parece ser  que el evento resize se produce al añadir el form del control del diseño visual y resizarse a su tamaño con lo cual el evento micontrol_resize da error al no estar creados todavía los 48 label a los que hace referencia.

    Seguiré agradeciendo sugerencias para evitar que el evento resize se produzca antes de colocar todos los controles. No sé qué puedo estar haciendo mal pero estoy pensando en eliminar el resize y hacer un ajuste a resolución de pantalla con código en el evento Load, aunque repito que en el usercontrol actual de vb6 no existía este problema.

    Otra cosa que se me ocurre sobre la marcha es crear todos los controles desde 0 incluido el form y los combos sin diseñador visual ninguno, luego darles un size con código una vez colocados pero no sé si es posible en vb.net. En realidad solo tengo en diseño muy poco, un form cuadrado de 200x200 y dos combos, los 48 label restantes los creo con código.

    ...

     

     

    martes, 14 de septiembre de 2010 20:34