Creación de controles en tiempo de ejecuciónManual Práctico
Fecha: 10/Ago/2005 (09-08-05)
|
Cómo crea componentes en tiempo de ejecución
.Net tiene una gran cantidad de controles que heredan de la clase System.Windows.Forms.Control, entre ellos los más comunes podrían ser:
• Labels (etiquetas)
• TextBox (Cuadros de texto)
• Buttons (Botones)
Nombro solo estos porque serán los que utilizaré en este ejemplo práctico:
Lo que haremos es crear un formulario que tendrá:
• 2 GroupBoxes:
- GroupBox1: que será el contenedor de nuestros controles nuevos
- GroupBox2: que contendrá nuestros controles de creación
• 3 RadioButtons (que estarán dentro del GroupBox2)
- RadioButton1: para Textbox
- RadioButton2: para Labels
- RadioButton3: para buttons
• 2 NumericUpDowns
- NumericUpDown1: para indicar la posición en X
- NumericUpDown2: para indicar la posición en Y
• 1 ListBox
- ListBox1: Para poder manejar los nuevos controles
• 2 Buttons
- btmCrear: Para crear los nuevos controles (y estará dentro del GroupBox1)
- btmEliminar: Para eliminar el control que esté indicado en el ListBox
A nivel código este proyecto tendrá 3 procedimientos
• Uno para crear un nuevo control
• Uno para eliminar el control seleccionado
• Uno que será el evento click de todos los controles que creemos (a modo de ejemplo)
También habrá una variable
• iContador: Que la utilizaremos para evitar duplicar nombres de controles
Bueno y para terminar (o empezar) el código:
'iContador se utilizará para evitar duplicar los nombre de los 'nuevos controles Dim iContador As Integer 'Este procedimiento es el que crea los controles dentro del 'GroupBox1 Private Sub btmCrear_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btmCrear.Click 'Variable de mi nuevo objeto Dim MyNewObject As Control 'Creo una nueva instancia del control seleccionado If RadioButton1.Checked Then MyNewObject = New TextBox 'Nuevo TextBox ElseIf RadioButton2.Checked Then MyNewObject = New Label 'Nueva Etiqueta ElseIf RadioButton3.Checked Then MyNewObject = New Button 'Nuevo Botón End If 'Levanto el tipo del nuevo objeto Dim MyTipo As System.Type = MyNewObject.GetType 'Con el nombre del tipo y el contador le doy un nombre MyNewObject.Name = MyTipo.Name & Convert.ToString(iContador) 'En la propiedad Text le pongo el nombre del nuevo control '(solo para que se vea bien en el ejemplo) MyNewObject.Text = MyNewObject.Name 'Ubico el nuevo control segun indicado MyNewObject.Location = New System.Drawing.Point(NumericUpDown1.Value, NumericUpDown2.Value) MyNewObject.Width = 45 'Le agrego al evento Click de mi nuevo control el evento ClickEvent 'Aqui se podría agregar un manejador a cualquier evento que uno quiera AddHandler MyNewObject.Click, AddressOf ClickEvent 'Agrego el control al contenedor '(que podría claramente ser Me.controls, en vez de GroupBox1.control ¿no?) Me.GroupBox1.Controls.Add(MyNewObject) 'Para que el ejemplo sea claro cambio algunas variables 'Agrego 1 al contador iContador += 1 'Pongo el nombre de mi nuevo control en el listbox 'para poder borrarlo Me.ListBox1.Items.Add(MyNewObject.Name) 'Muevo los valores para que no se sobreescriban los proximos controles If NumericUpDown1.Value + 50 <= NumericUpDown1.Maximum Then NumericUpDown1.Value += 50 Else NumericUpDown1.Value = 10 If NumericUpDown2.Value + 20 <= NumericUpDown2.Maximum Then NumericUpDown2.Value += 20 End If End If End Sub 'Este es el evento que vamos a atar al evento click de los nuevos controles Private Sub ClickEvent(ByVal sender As System.Object, ByVal e As System.EventArgs) 'A modo de ejemplo muestro un messagebox con el nombre de control que lo llamó MessageBox.Show(sender.name) End Sub 'Elimino un control Private Sub btmEliminar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btmEliminar.Click 'Chequeo si el listbox tiene algo seleccionado If Not Me.ListBox1.SelectedItem Is Nothing Then 'Recorro todos los controles del GroupBox1 buscando el control 'que deseo eliminar Dim Eliminar As Control For Each Eliminar In Me.GroupBox1.Controls If Eliminar.Name = ListBox1.SelectedItem Then 'Saco el control de la colección Me.Controls.Remove(Eliminar) 'Destruyo el control Eliminar.Dispose() 'Saco el control del Listbox Me.ListBox1.Items.Remove(Me.ListBox1.SelectedItem) 'Salgo del For Exit For End If Next End If End Sub
Fichero con el código de ejemplo: Facund_ControlesEnTiempoDeEjecucion_VB.zip - 9,36 KB