Agregar controles en tiempo de ejecución a un panel en Visual Basic .Net

Muchas veces surge la necesidad de crear controles (texbox, image, label, panel, etc) en tiempo de ejecución, esto quiere decir mientras estamos usando el programa en respuesta a un suceso, como por ejemplo un clic en un botón. Esta tarea suele ser catalogada como compleja, en esta oportunidad les traemos un código que agrega un elemento en un panel en tiempo de ejecución.

Asumiremos que ya tenemos creado un panel cuyo nombre sera panelPrincipal


  Dim imagenBanner = New System.Windows.Forms.PictureBox() 'Siempre antes de agregar un control hay que crearlo con New

  imagenBanner.Dock = DockStyle.Fill 'Autoajusta la imagen al tamaño del panel acomplandola
  imagenBanner.Image = New Bitmap("C://imagen.jpg") 'ruta de la imagen
  imagenBanner.Location = New System.Drawing.Point(0, 0)
  imagenBanner.Name = "imagenPanel" 'nombre imagen
  imagenBanner.Size = New Size(131, 107)
  imagenBanner.SizeMode = PictureBoxSizeMode.StretchImage 'Autoajuste de imagen 
  imagenBanner.TabIndex = 0
  imagenBanner.TabStop = False

  panelPrincipal.Controls.Add(imagenBanner)'Con esta instrucción se agrega un control al panel

Esta función no se limita solo a imágenes podríamos agregar cualquier otro tipo de control en el panel con esta misma instrucción. Además no necesariamente tienen que ser agregados a un panel la función Controls también se encuentra en otros elementos como formularios, Groupbox, tabControl, etc. Si tienen dudas o comentarios no duden en dejar sus comentarios.

Saludos

También te podría gustar...

19 Respuestas

  1. Jaaziel dice:

    Como puedo acoplar un programa ejecutable (que sea externo al proyecto, y que no sea un form del proyecto) en un panel? Ayuda por favor

  2. Bernal Arce Ramírez dice:

    Me asignaron la tarea de crear un programa que me permita crear cuadros y líneas para formar un árbol pero no con la función treeView, sino que el usuario final pueda crear nuevos nodos, cambiar las propiedades (color, borde, etc) de los cuadros y las propiedades de las líneas que unen los cuadros y la verdad es hija de Dios no sé ni por donde empezar, si me ayudan se los voy a agradecer por siempre

  3. ROBLE dice:

    hola, y cómo se declara el tipo FlowLayoutPanel?

  4. david dice:

    hola me podrian ayudar en el ejercicio que me piden en la escuela es agregar controles en tiempo de ejecucion …. tengo que tener un checkbox y cuando yo seleccione el checkbox tengo que tener un txt para decirle cuantos checkbox quiero, si yo le doy dos y en un boton que diga agregar que le di clik me los agrege automaticamente

    • David buenas tardes, para realizar ese ejercicio te recomiendo utilizar un panel de tipo FlowLayoutPanel, la principal caracteristica de este componente es que adapta los controles y los deja ordenados. Luego para hacer tu ejercicio solo debes utilizar el evento Click del botón y hacer un for limitado a la cantidad ingresada,para posteriormente dentro del for agregar un nuevo checkbox.
      Ejemplo:

      protected void btnIngresarCheck_Click(object sender, EventArgs e)
      {
      for(int i = 0; i < Int32.Parse(txtCantidad.Text) ; i++){ MiFlowLayoutPanel.Controls.Add(new CheckBox()); } } Saludos

      • david dice:

        muchas gracias amigo yo lo empese hacer diferente
        Public Class win
        Dim i As Integer
        Dim x As Integer
        Dim y As Integer
        Dim pnl As New Panel
        Event click_crear()
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Me.Controls.Add(pnl)
        End Sub

        Private Sub CheckBox1_txt_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged
        If Me.CheckBox1.Checked = True Then

        Me.CheckBox2.Enabled = False
        Me.CheckBox3.Enabled = False
        Me.CheckBox4.Enabled = False

        Else
        Me.CheckBox2.Enabled = True
        Me.CheckBox3.Enabled = True
        Me.CheckBox4.Enabled = True

        End If

        End Sub

        Private Sub CheckBox2_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox2.CheckedChanged
        If Me.CheckBox2.Checked = True Then

        Me.CheckBox1.Enabled = False
        Me.CheckBox3.Enabled = False
        Me.CheckBox4.Enabled = False

        Else
        Me.CheckBox1.Enabled = True
        Me.CheckBox3.Enabled = True
        Me.CheckBox4.Enabled = True

        End If
        End Sub

        Private Sub CheckBox3_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox3.CheckedChanged
        If Me.CheckBox3.Checked = True Then

        Me.CheckBox1.Enabled = False
        Me.CheckBox2.Enabled = False
        Me.CheckBox4.Enabled = False

        Else
        Me.CheckBox1.Enabled = True
        Me.CheckBox2.Enabled = True
        Me.CheckBox4.Enabled = True

        End If
        End Sub

        Private Sub CheckBox4_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox4.CheckedChanged
        If Me.CheckBox4.Checked = True Then

        Me.CheckBox1.Enabled = False
        Me.CheckBox2.Enabled = False
        Me.CheckBox3.Enabled = False

        Else
        Me.CheckBox1.Enabled = True
        Me.CheckBox2.Enabled = True
        Me.CheckBox3.Enabled = True

        End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        If CheckBox1.Checked Then
        x = TextBox1.Text
        Dim arreglo_btns(x) As TextBox

        For Me.i = 1 To x
        arreglo_btns(i) = New TextBox
        arreglo_btns(i).Location = New Point(120, i * 40)
        Me.Controls.Add(arreglo_btns(i))
        Next

        »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
        ElseIf CheckBox2.Checked Then

        x = TextBox1.Text
        Dim arreglo_chk(x) As Label

        For Me.i = 1 To x
        arreglo_chk(i) = New Label
        arreglo_chk(i).Location = New Point(230, i * 40)
        Me.Controls.Add(arreglo_chk(i))
        Next
        »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»

        ElseIf CheckBox3.Checked Then

        x = TextBox1.Text
        Dim arreglo_chk(x) As CheckBox

        For Me.i = 1 To x
        arreglo_chk(i) = New CheckBox
        arreglo_chk(i).Location = New Point(340, i * 40)
        Me.Controls.Add(arreglo_chk(i))
        Next

        »»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»»
        ElseIf CheckBox4.Checked Then
        x = TextBox1.Text
        Dim arreglo_btns(x) As Button

        For Me.i = 1 To x
        arreglo_btns(i) = New Button
        arreglo_btns(i).Location = New Point(450, i * 40)
        Me.Controls.Add(arreglo_btns(i))
        Next
        End If

        ********
        pero ahora mi problema es que no encuentro como borrar lo que se ejecuta en la pantalla

  5. David dice:

    Hola, he intentado usar el código »
    AddHandler imagenBanner.Click, AddressOf miEvento

    Private Sub miEvento (ByVal sender As System.Object, ByVal e As EventArgs)

    … ‘ Todo tu código

    End Sub» que mencionas en una de las primeras respuestas, pero me da error de sintaxis. ¿Dónde debería colocar el código para que no diera tal error? Gracias por adelantado.

  6. Jose dice:

    Hola buen dia, en una plaicacion web asp.net c# he creado objetos dinamico provenientes de una tabla en SQL pero ahora mi problema es que necesito obtener el valos de los textbox que escribio el usuario para guardarlos en una BDD, alguien sabe como puedo hacer esto?

    • Si logras crearlos dinamicamente te recomiendo asignarles un identificador único de modo que puedas identificarlos (TAG). Adicional a esto tu problema se soluciona recorriendo los controles de un panel utilizando foreach, de esta manera puedes filtrar por los tipos creados por ti y obtener sus valores.

      Saludos

  7. Juan Antonio dice:

    Hola. Me parece interesante. Yo ya he desarrollado objetos que se crean en tiempo de ejecucion, pero ahora, por desconocer la cantidad y el limite de espacio en la pantalla, debo crearlas dentro de un panel (System.Windows.Forms.Panel) para que al crecer el numero de objetos estos se desplacen con un Vertical ScroolBar.

    Mi pregunta es, al indicar la posicion del nuevo objeto, como asigno que la posicion X e Y se refieren dentro del panel y no de las coordenadas del Form.

    Gracias

    • Juan Antonio dice:

      Listo, quedo resuelto. Pongo aqui la solucion.

      Por ejemplo, creo un new label en tiempo de ejecucion y antes de ubicarlo indico a que contenedor pertenece.

      Si coloco Letrero(j) = new Label
      Letrero(j).Top = Y (posicion vertical inicial)
      Letrero(j).Left = X (posicion horizontal Inicial)

      lo colocara en el punto X,Y del Form general
      Pero si especifico antes de indicar la ubicacion

      letrero(j).Parent = Panel1 que es el contenedor donde deseo ubicarlo entonces se ubicara en lso puntos X,Y del Panel.

      Debe funcionar igual si el contenedor es un GroupBox, o un TabControl o un SplitContainer. ya habra tiempo de probarlo.

      Espero les sirva. Saludos

      • Disculpa por la demora intenta utilizar el objeto FlowLayoutPanel, este objeto es un panel con la particularidad que ubica automáticamente los componentes que se van agregando en el orden en que los agregas. No estoy seguro de si resuelva tu problema, pero es una alternativa que utilizo mucho.

        Saludos

  8. Audad Quiroga dice:

    Un saludo…
    Como creo una matriz de labels… ( myLabel(1), myLabel(2)… myLabel(n)…
    Gracias…

    • Esta es una de las tantas maneras que existen:

                  List
  9. Guillermo dice:

    y cómo hago para usar eventos, de esos controles agregados en tiempo de ejecución, por ejemplo, si quiero que al hacer click sobre alguno de ellos, se ejecute un procedimiento

Deja una respuesta

Tu dirección de correo electrónico no será publicada.