Creación de controles en tiempo de ejecución

Manual Práctico

 

Fecha: 10/Ago/2005 (09-08-05)
Autor: Facundo Dhers

 


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


ir al índice