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
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
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
hola, y cómo se declara el tipo FlowLayoutPanel?
Tienes que agregarlo al formulario desde el diseñador, se encuentra en la misma pestaña de los Paneles normales.
tu código está orientado a web o desktop?
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
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
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.
Dentro del método y despues de la creación de la imagen, tienes que tener claro que el método miEvento debe existir en el código.
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
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
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
Un saludo…
Como creo una matriz de labels… ( myLabel(1), myLabel(2)… myLabel(n)…
Gracias…
Esta es una de las tantas maneras que existen:
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
Debajo del código pones
AddHandler imagenBanner.Click, AddressOf miEvento
Private Sub miEvento (ByVal sender As System.Object, ByVal e As EventArgs)
… ‘ Todo tu código
End Sub