none
Referenciar un control en el código que será creado en tiempo de ejecución. RRS feed

  • Pregunta

  • Gracias a todos de antemano por buestra ayuda.

    Dejenme que les explique cual es mi problema.

    Hace tiempo que estoy haciendo una aplicación de examenes tipo test y basicamente es un winform que contiene un flowLayoutPanel donde cargo las preguntas y las respuestas mediante dos consultas LinQ que hago a una BD.

    Básicamente:

    Ejecuto el programa

    1. Mediante un botón creo 20 números aleatorios que no se repiten.
    2. Mediante una consulta LinQ busco la quegunta utilizando secuencialmente los numeros generados aleatoriamente a modo de Id.
    3. Creo en el flowLayoutPanel principal en tiempo de ejecución un textBox para pintar la pregunta.
    4. Mediante una consulta LinQ busco las respuestas.
    5. Creo un flowLayoutPanel secundario en tiempo de ejecición.
    6. Creo dentro del flowLayoutPanel secundario en tiempo de ejecición checkBoxs para mostrar las respuestas y que el usuario pueda marcar su eleccion de respuesta.
      • Creo tantos CheckBox como respuestas hay en la BD para esa pregunta.
    7. Le asigno en la propiedad Tag de cada checkBox si esa respuesta es correcta o no. (True o False)

    Basicamente queda como un examen tipo test como los de papel con 20 perguntas seguidas de las posibles respuestas.

    Hasta aquí todo bien y sin problemas.

    Mi idea inicial era un boton para hacer una comprobación mediante un foreach de los checkBox que hay dentro de cada flowLayoutPanel secundario que he ido numerando secuencialmente del 1 al 20 y como tengo la respuesta en la propiedad Tag de cada control checkBox parecia facil.

    Aclaración: Cada pegunta tiene de 2 a 5 respuestas y tan solo que fallen una respuesta, la pregunta no ha sido correctamente respondida, por lo que cada pregunta solo puede ser bien respondida o mal respondida.      

    El problema viene ahora: como los controles se crean en tiempo de ejecución, no puedo referenciar un control “flowLayoutPanel” que no existe, para recorrerlo con un foreach y hacer la comprobación de que checkBoxs están marcados.  

    Hace dias que le doy vueltas que no le encuantro la solución.

    Prodriais ayudar me por favor.


    Little Sharp

    jueves, 31 de mayo de 2018 13:43

Respuestas

  • Hola Little Sharp:

    Siempre puedes recorrer los controles de tu contenedor tipo floatLayoutPanel

      private void button1_Click(object sender, EventArgs e)
            {
    
                FlowLayoutPanel f = new FlowLayoutPanel();
                f.Location = new System.Drawing.Point(26, 12);
                f.Name = "FlowLayoutPanel1";
                f.BackColor = Color.AliceBlue;
                f.Size = new System.Drawing.Size(228, 20);
                f.TabIndex = 0;
                FlowLayoutPanel f2 = new FlowLayoutPanel();
    
                f2.Location = new System.Drawing.Point(260, 120);
                f.BackColor = Color.Azure;
                f2.Name = "FlowLayoutPanel2";
    
                f2.Size = new System.Drawing.Size(480, 40);
    
                f2.TabIndex = 1;
                flowLayoutPanel1.Controls.Add(f);
                flowLayoutPanel1.Controls.Add(f2);
                
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                foreach (FlowLayoutPanel f in flowLayoutPanel1.Controls)
                {
                    f.BackColor = Color.Blue;
                }
            }

    En mi caso genero dos floatLayoutPanel dentro de un panel... le establezco alguna propiedad para ver su comportamiento, y en el botón dos, recorro los paneles que hay dentro de los controles de mi panel principal.

    Con algo así, tienes para poder recorrerlos. Si te he entendido bien.

    Un saludo

    • Marcado como respuesta Little Sharp jueves, 31 de mayo de 2018 14:41
    jueves, 31 de mayo de 2018 14:27

Todas las respuestas

  • Hola Little Sharp:

    Siempre puedes recorrer los controles de tu contenedor tipo floatLayoutPanel

      private void button1_Click(object sender, EventArgs e)
            {
    
                FlowLayoutPanel f = new FlowLayoutPanel();
                f.Location = new System.Drawing.Point(26, 12);
                f.Name = "FlowLayoutPanel1";
                f.BackColor = Color.AliceBlue;
                f.Size = new System.Drawing.Size(228, 20);
                f.TabIndex = 0;
                FlowLayoutPanel f2 = new FlowLayoutPanel();
    
                f2.Location = new System.Drawing.Point(260, 120);
                f.BackColor = Color.Azure;
                f2.Name = "FlowLayoutPanel2";
    
                f2.Size = new System.Drawing.Size(480, 40);
    
                f2.TabIndex = 1;
                flowLayoutPanel1.Controls.Add(f);
                flowLayoutPanel1.Controls.Add(f2);
                
            }
    
            private void button2_Click(object sender, EventArgs e)
            {
                foreach (FlowLayoutPanel f in flowLayoutPanel1.Controls)
                {
                    f.BackColor = Color.Blue;
                }
            }

    En mi caso genero dos floatLayoutPanel dentro de un panel... le establezco alguna propiedad para ver su comportamiento, y en el botón dos, recorro los paneles que hay dentro de los controles de mi panel principal.

    Con algo así, tienes para poder recorrerlos. Si te he entendido bien.

    Un saludo

    • Marcado como respuesta Little Sharp jueves, 31 de mayo de 2018 14:41
    jueves, 31 de mayo de 2018 14:27
  • Muchisimas gracias Javi.!!!

    Para que funcionase he sustituido el "FlowLayoutPanel" de tu codigo por el "Control" y ya funciona.

    Ahora puedo acceder la los controles que se crearán.

     private void button2_Click(object sender, EventArgs e)
            {
                foreach (Controls f in flowLayoutPanel1.Controls)
                {
                    f.BackColor = Color.Blue;
                }
            }

    Gracias de nuevo.

    Voy a seguir que seguro que me surgen mas problemas.


    Little Sharp

    jueves, 31 de mayo de 2018 14:46