vb.net - usuario - crear controles en tiempo de ejecucion vb net
Cómo asociar todos los controles de cuadro de texto en un formulario con el mismo controlador de eventos (6)
VB 2008.
Tengo varios cuadros de texto en un formulario y quiero que cada uno de ellos use el mismo controlador de eventos. Sé cómo conectar manualmente cada uno de ellos al controlador, pero estoy buscando una forma más genérica, así que si agrego más cuadros de texto, se conectarán automáticamente al controlador de eventos.
Ideas?
EDITAR: Usando la muestra C # de MusiGenesis (y con la ayuda del comentario dejado por nick), escribí este código VB:
Private Sub AssociateTextboxEventHandler()
For Each c As Control In Me.Controls
If TypeOf c Is TextBox Then
AddHandler c.TextChanged, AddressOf tb_TextChanged
End If
Next
End Sub
¡Muchas gracias! SO es genial.
Creo que esto actualizará todos los controles de texto.
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
UpdateControls(Me)
End Sub
Private Sub UpdateControls(ByVal myControlIN As Control)
Dim myControl
For Each myControl In myControlIN.Controls
UpdateControls(myControl)
Dim myTextbox As TextBox
If TypeOf myControl Is TextBox Then
myTextbox = myControl
AddHandler myTextbox.TextChanged, AddressOf TextBox_TextChanged
End If
Next
End Sub
Private Sub TextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
MsgBox("text changed in " & CType(sender, TextBox).Name)
End Sub
Haga algo como esto en el evento de carga de su formulario (C #, lo siento, pero es fácil de traducir):
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is TextBox)
{
TextBox tb = (TextBox)ctrl;
tb.TextChanged += new EventHandler(tb_TextChanged);
}
}
}
void tb_TextChanged(object sender, EventArgs e)
{
TextBox tb = (TextBox)sender;
tb.Tag = "CHANGED"; // or whatever
}
No es correctamente recursivo (no encontrará cuadros de texto en los paneles, por ejemplo), pero se entiende.
Podría iterar recursivamente sobre la colección Controls en OnLoad del formulario y asignar el controlador de eventos a cualquier cuadro de texto que encuentre.
Podría ser posible con una macro, pero, de lo contrario, no tengo conocimiento de nada que pueda conectar automáticamente un control a un controlador genérico.
La única manera fácil que conozco sería seleccionar todas las cajas de texto asignables y simplemente configurar el manejador de eventos para el evento de clic al mismo tiempo, pero eso no es automático.
"c Como control" no tiene evento "TextChanged", por lo que lanzará un error. Puede optimizar eso para Linq y también deshacerse de ese error con:
For Each c As TextBox In Controls.OfType(Of TextBox)()
AddHandler c.TextChanged, AddressOf tb_TextChanged
Next
Pero eso evitaría ir más profundo que el primer nivel.
Tengo muchos cuadros de texto dentro de muchos GroupBox dentro de un TabPage-Control.
Para agregar / definir / eliminar el controlador de esos cuadros de texto tuve que repetir primero a través de las páginas de tabulación, luego a través de los cuadros de grupo en cada página de tabulación y luego puedo acceder a los cuadros de texto dentro de estos cuadros de grupo.
'' cycle through TabPages ...
For Each page As TabPage In Me.TabControl1.Controls.OfType(Of TabPage)()
'' in every TabPage cycle through Groupboxes ...
For Each gbox As GroupBox In page.Controls.OfType(Of GroupBox)()
'' and in every TextBox inside the actual GroupBox
For Each tbox As TextBox In gbox.Controls.OfType(Of TextBox)()
AddHandler tbox.TextChanged, AddressOf _TextChanged
Next
Next
Next
Private Sub _TextChanged(sender As System.Object, e As System.EventArgs)
somethingWasChanged = True
End Sub