Array de Controles con Eventos en VB.NET

Iniciado por bybaal, 18 Enero 2021, 07:54 AM

0 Miembros y 1 Visitante están viendo este tema.

bybaal

Hace tiempo que estoy buscando como crear arrays de controles y que estos respondan a eventos en vb.net y no he logrado encontrar algo que me sirva para algo como esto:

Supongamos que tengo un botón que dice buscar y que cada vez que el usuario haga click en el, se cree una etiqueta que diga Buscando y un boton que diga detener y que al hacer click en el botón Detener se elimine el botón y su etiqueta correspondiente

Saludos y gracias

ThunderCls

#1
Lo haces creando dichos controles dinamicamente, algo como esto:

Código (csharp) [Seleccionar]
List<Control> ctrls = new List<Control>();

void BtnSearchClick(object sender, EventArgs e) {
    Label lblStatus = new Label {
        Text = "Buscando...",
        Location = new Point(200, 104)
    };

    Button btnStop = new Button {
        Text = "Detener",
        Location = new Point(300, 100)
    };

    btnStop.Click += (obj, args) => {
        // codigo para detener operacion
        // ...

        foreach(var ctrl in ctrls) {
            this.Controls.Remove(ctrl);
            ctrl.Dispose();
        }

        ctrls.Clear();
    };

    ctrls.Add(lblStatus);
    ctrls.Add(btnStop);
    this.Controls.AddRange(ctrls.ToArray());
}


Saludos

EDIT: Ni siquiera me fije en la referencia a VB.NET  :xD :silbar:
-[ "...I can only show you the door. You're the one that has to walk through it." – Morpheus (The Matrix) ]-
http://reversec0de.wordpress.com
https://github.com/ThunderCls/

FJDA

#2
[MODIFICADO]

Los arrays de controles en VB.NET se crean con variables de objetos

Ejemplo sencillo

Código (vbnet) [Seleccionar]

   Dim MiLabel As Label
       MiLabel = New Label
       MiLabel.Text = "Hola mundo"
       Me.Controls.Add(MiLabel)



Puedes declararlo de forma general para poder ser creado dentro de cualquier evento. En este ejemplo se declara el objeto y desde el un botón se le asigna una propiedad y se añade al Form.


Código (vbnet) [Seleccionar]

Public Class Form1
   Dim MiLabel As New Label
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
   End Sub
   Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
       MiLabel.Text = "Hola mundo"
       Me.Controls.Add(MiLabel)

   End Sub
End Class



Y por último lo mismo pero creando un array para las etiquetas y un botón además del evento Click para dicho botón. (Mas tarde he modificado el código y añadí eventos a la matriz de etiquetas 'Label' tras volver a leer tu duda)

Código (vbnet) [Seleccionar]

Public Class Form1
   Dim MiLabel(5) As Label
   Dim MiBoton As New Button
   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       Me.Width = 200 : Me.Height = 300

       With MiBoton 'Propiedades para el botón
           MiBoton.Text = "Crear Labels"
           MiBoton.Location = New Point(20, 20)
       End With
       Me.Controls.Add(MiBoton) 'Añade el control al formulario Form1
       AddHandler MiBoton.Click, AddressOf MiBoton_Click  'Vincula MiBoton con el evento MiBoton_Click y evento Click


   End Sub
   Private Sub MiBoton_Click(sender As Object, e As EventArgs)
       Dim iTop As Integer = 30
       For I As Integer = 0 To MiLabel.Count - 1
           iTop += 20
           MiLabel(I) = New Label 'Crea los 6 Labels
           With MiLabel(I) 'Asigna propideades
               .Text = "Label " & (I + 1)
               ' .Top = iTop
               ' .Left = 20
               .Location = New Point(20, iTop)
               .Font = New Font("Calibri", 12)
           End With

           Me.Controls.Add(MiLabel(I)) 'Añade los seis Labels al formulario.
       Next

       For I As Integer = 0 To MiLabel.Length - 1
           AddHandler MiLabel(I).Click, AddressOf MiLabel_Click  'Vincula MiLabel con el evento MiLabel_Click y evento Click
       Next

   End Sub

   Private Sub MiLabel_Click(sender As Object, e As EventArgs)
       Dim Index As Integer = Array.IndexOf(MiLabel, sender)
       If Index.Equals(0) Then MiLabel(0).Text = "Hiciste Click"
       If Index.Equals(1) Then MiLabel(1).Text = "Hiciste Click"
   End Sub


End Class



Mírate también otras aportaciones de otros usuarios

https://foro.elhacker.net/net_c_vbnet_asp/crear_controles_en_tiempo_de_ejecucion-t445828.0.html;msg2051279#msg2051279

https://foro.elhacker.net/net_c_vbnet_asp/crear_controles_en_tiempo_de_ejecucion-t445828.0.html;msg2051365#msg2051365


y recuerda usar el método Control.Dispose() cuando ya no lo vayas a usar para  eliminar el objeto y liberar memoria.






bybaal

Perfecto, mil gracias, esto resuelve completamente mis dudas.