2008-10-07 37 views
7

VB 2008如何将所有文本框控件的窗体上使用相同的事件处理程序相关联

我有一个表格上的几个文本框,我想他们每个人使用相同的事件处理程序。我知道如何手动将每个线路连接到处理程序,但我正在寻找更通用的方法,因此如果我添加更多文本框,它们将自动连接到事件处理程序。

想法?

编辑:从MusiGenesis使用C#示例(与由尼克留下评论的帮助下),我写了这个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 

非常感谢!太棒了。

回答

9

不要在你的窗体的Load事件是这样的(C#,对不起,但它很容易翻译):

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 
} 

这不是正确的递归(它不会在面板上找到的文本框,例如) ,但你明白了。

+1

VB.NET,所述equivolent至+ =上一个事件是使用的AddHandler – Nick 2008-10-07 18:52:15

0

它可能是一个宏,但除此之外,我不知道任何会自动将控件连接到通用处理程序的任何东西。

我知道的唯一简单的方法是选择所有可应用的文本框,并简单地设置单击事件的事件处理程序在同一时间,但这不是自动的。

2

您可以递归地迭代窗体的OnLoad中的Controls集合,并将事件处理程序分配给您找到的任何文本框。

+0

我很想看到在VB.NET中执行此操作的代码。在Delphi中这种事情非常简单,但我还没有看到在VB.NET中做到这一点的明确方法。 – JosephStyons 2008-10-07 18:49:11

+1

对于每个C为me.controls 控制如果typeof运算c是文本框 c.addhandler c.textchanged,addressof textboxhandler 结束时,如果下一个 在 – 2008-10-07 19:45:34

0

我认为这将更新所有文本控件。

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

你可以说“如果myControl.HasChildren然后UpdateControls(myControl)”。 – MusiGenesis 2008-10-08 02:41:46

3

“c As Control”没有“TextChanged”事件,所以会引发错误。 您可以优化,为LINQ和也得到与摆脱错误的:

For Each c As TextBox In Controls.OfType(Of TextBox)() 
    AddHandler c.TextChanged, AddressOf tb_TextChanged 
Next 

但是,这会避免去比第一级你更深。

0

我有很多TextBoxes里面的TabPage控件内的许多GroupBoxes。

要添加/定义/删除这些文本框的处理程序,我必须首先遍历Tabpages,然后遍历每个Tabpage中的Groupbox,然后才能访问这些Groupbox中的文本框。

' 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 
相关问题