2008-10-07 80 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 
相關問題