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
Lo haces creando dichos controles dinamicamente, algo como esto:
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:
[MODIFICADO]
Los arrays de controles en VB.NET se crean con variables de objetos
Ejemplo sencillo
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.
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)
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;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.
Perfecto, mil gracias, esto resuelve completamente mis dudas.