2008-10-07 8 views
7

VB 2008.Cómo asociar todos los controles de cuadro de texto en un formulario con el mismo controlador de eventos

tengo varios cuadros de texto en un formulario y quiero que cada uno de ellos a utilizar 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?

EDIT: Usando el ejemplo de C# de MusiGenesis (y con la ayuda del comentario dejado por nick), escribí el 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.

Respuesta

9

hacer algo como esto en el evento de carga de su forma (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 propiamente recursiva (no encontrará cuadros de texto en los paneles, por ejemplo) , Pero se entiende la idea.

+1

En VB.NET, la equivolent a + = en un evento es utilizar AddHandler – Nick

0

Podría ser posible con un macro, pero, de lo contrario, no estoy al tanto 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.

2

Puede iterar recursivamente sobre la colección Controls en OnLoad del formulario y asignar el controlador de eventos a cualquier cuadro de texto que encuentre.

+0

Me gustaría ver el código para hacer esto en VB.NET. Este tipo de cosas es muy fácil en Delphi, pero aún no he visto una forma clara de hacerlo en VB.NET. – JosephStyons

+1

Para Cada c como control en Me.Controls si typeof c es cuadro de texto c.addhandler c.textchanged, AddressOf textboxhandler final si siguiente –

0

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 
+0

Podría decir "If myControl.HasChildren Then UpdateControls (myControl)". – MusiGenesis

3

"c As Control" no tiene evento "TextChanged", por lo que arrojará un error. Es posible optimizar que a 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 que ir más allá de primer nivel tú.

+0

No hay ningún error porque verifico el tipo del control ('Si TypeOf c es TextBox Then') antes de agregar el controlador' TextChanged'. – aphoria

+0

Tiene toda la razón. Pero sin ningún motivo aparente, cuando agregué ese código a mi aplicación de prueba arrojó el error. – Sergio

0

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 ficha 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 
Cuestiones relacionadas