Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: bybaal en 18 Enero 2021, 07:54 am



Título: Array de Controles con Eventos en VB.NET
Publicado por: bybaal en 18 Enero 2021, 07:54 am
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


Título: Re: Array de Controles con Eventos en VB.NET
Publicado por: ThunderCls en 19 Enero 2021, 18:49 pm
Lo haces creando dichos controles dinamicamente, algo como esto:

Código
  1. List<Control> ctrls = new List<Control>();
  2.  
  3. void BtnSearchClick(object sender, EventArgs e) {
  4.    Label lblStatus = new Label {
  5.        Text = "Buscando...",
  6.        Location = new Point(200, 104)
  7.    };
  8.  
  9.    Button btnStop = new Button {
  10.        Text = "Detener",
  11.        Location = new Point(300, 100)
  12.    };
  13.  
  14.    btnStop.Click += (obj, args) => {
  15.        // codigo para detener operacion
  16.        // ...
  17.  
  18.        foreach(var ctrl in ctrls) {
  19.            this.Controls.Remove(ctrl);
  20.            ctrl.Dispose();
  21.        }
  22.  
  23.        ctrls.Clear();
  24.    };
  25.  
  26.    ctrls.Add(lblStatus);
  27.    ctrls.Add(btnStop);
  28.    this.Controls.AddRange(ctrls.ToArray());
  29. }

Saludos

EDIT: Ni siquiera me fije en la referencia a VB.NET  :xD :silbar:


Título: Re: Array de Controles con Eventos en VB.NET
Publicado por: FJDA en 19 Enero 2021, 20:07 pm
[MODIFICADO]

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

Ejemplo sencillo

Código
  1.    Dim MiLabel As Label
  2.        MiLabel = New Label
  3.        MiLabel.Text = "Hola mundo"
  4.        Me.Controls.Add(MiLabel)
  5.  


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
  1. Public Class Form1
  2.    Dim MiLabel As New Label
  3.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  4.    End Sub
  5.    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  6.        MiLabel.Text = "Hola mundo"
  7.        Me.Controls.Add(MiLabel)
  8.  
  9.    End Sub
  10. End Class
  11.  


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
  1. Public Class Form1
  2.    Dim MiLabel(5) As Label
  3.    Dim MiBoton As New Button
  4.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  5.        Me.Width = 200 : Me.Height = 300
  6.  
  7.        With MiBoton 'Propiedades para el botón
  8.            MiBoton.Text = "Crear Labels"
  9.            MiBoton.Location = New Point(20, 20)
  10.        End With
  11.        Me.Controls.Add(MiBoton) 'Añade el control al formulario Form1
  12.        AddHandler MiBoton.Click, AddressOf MiBoton_Click  'Vincula MiBoton con el evento MiBoton_Click y evento Click
  13.  
  14.  
  15.    End Sub
  16.    Private Sub MiBoton_Click(sender As Object, e As EventArgs)
  17.        Dim iTop As Integer = 30
  18.        For I As Integer = 0 To MiLabel.Count - 1
  19.            iTop += 20
  20.            MiLabel(I) = New Label 'Crea los 6 Labels
  21.            With MiLabel(I) 'Asigna propideades
  22.                .Text = "Label " & (I + 1)
  23.                ' .Top = iTop
  24.                ' .Left = 20
  25.                .Location = New Point(20, iTop)
  26.                .Font = New Font("Calibri", 12)
  27.            End With
  28.  
  29.            Me.Controls.Add(MiLabel(I)) 'Añade los seis Labels al formulario.
  30.        Next
  31.  
  32.        For I As Integer = 0 To MiLabel.Length - 1
  33.            AddHandler MiLabel(I).Click, AddressOf MiLabel_Click  'Vincula MiLabel con el evento MiLabel_Click y evento Click
  34.        Next
  35.  
  36.    End Sub
  37.  
  38.    Private Sub MiLabel_Click(sender As Object, e As EventArgs)
  39.        Dim Index As Integer = Array.IndexOf(MiLabel, sender)
  40.        If Index.Equals(0) Then MiLabel(0).Text = "Hiciste Click"
  41.        If Index.Equals(1) Then MiLabel(1).Text = "Hiciste Click"
  42.    End Sub
  43.  
  44.  
  45. End Class
  46.  


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;msg2051279#msg2051279)

https://foro.elhacker.net/net_c_vbnet_asp/crear_controles_en_tiempo_de_ejecucion-t445828.0.html;msg2051365#msg2051365 (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.







Título: Re: Array de Controles con Eventos en VB.NET
Publicado por: bybaal en 20 Enero 2021, 06:50 am
Perfecto, mil gracias, esto resuelve completamente mis dudas.