visual usuario tiempo studio sirve que propiedad por para net formulario ejecucion dinamicamente crear controles control codigo botones agregar vb.net

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