2008-10-07 30 views
7

VB 2008.Làm thế nào để kết hợp tất cả các điều khiển hộp trên một hình thức với các xử lý sự kiện tương tự

Tôi có một vài hộp văn bản trên một hình thức và tôi muốn mỗi người trong số họ sử dụng các xử lý sự kiện tương tự. Tôi biết làm thế nào để tự dây mỗi người lên đến xử lý, nhưng tôi đang tìm một cách chung chung hơn vì vậy nếu tôi thêm nhiều hộp văn bản họ sẽ tự động được nối với xử lý sự kiện.

Ý tưởng?

EDIT: Sử dụng mẫu C# từ MusiGenesis (và với sự giúp đỡ của những nhận xét trái bằng nick), tôi đã viết code VB này:

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 

Cảm ơn rất nhiều! SO là rất tốt.

Trả lời

9

Do something như thế này trong sự kiện load của form (C#, xin lỗi, nhưng nó dễ dàng để dịch):

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 
} 

Nó không đúng cách đệ quy (nó sẽ không tìm thấy hộp văn bản trên bảng, ví dụ) , nhưng bạn hiểu ý rồi đấy.

+1

Trong VB.NET, các equivolent đến + = trên một sự kiện là sử dụng AddHandler – Nick

0

Có thể có macro, nhưng nếu không, tôi không biết bất kỳ thứ gì sẽ tự động điều khiển một bộ xử lý chung.

Cách đơn giản nhất mà tôi biết là chọn tất cả hộp văn bản có thể áp dụng và chỉ cần đặt tổ chức sự kiện cho sự kiện nhấp cùng một lúc, nhưng điều đó không tự động.

2

Bạn có thể đệ quy lặp lại bộ sưu tập Điều khiển trong Tải trước của biểu mẫu và gán trình xử lý sự kiện cho bất kỳ hộp văn bản nào bạn tìm thấy.

+0

Tôi rất thích xem mã để làm điều này trong VB.NET. Loại điều này là rất dễ dàng trong Delphi, nhưng tôi đã không nhìn thấy một cách rõ ràng để làm điều đó trong VB.NET được nêu ra. – JosephStyons

+1

For Each c như kiểm soát trong me.controls nếu typeof c là textbox c.addhandler c.textchanged, AddressOf textboxhandler kết thúc nếu tiếp theo –

0

Tôi nghĩ rằng điều này sẽ cập nhật tất cả các điều khiển văn bản.

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

Bạn có thể nói "Nếu myControl.HasChildren Sau đó UpdateControls (myControl)". – MusiGenesis

3

"c Kiểm soát" không có sự kiện "TextChanged", vì vậy nó sẽ phát sinh lỗi. Bạn có thể tối ưu hóa đó để LINQ và cũng thoát khỏi lỗi với:

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

Nhưng điều đó sẽ tránh đi sâu hơn so với mức đầu ngươi.

+0

Không có lỗi vì tôi kiểm tra loại điều khiển ('Nếu TypeOf c là TextBox Then') trước khi thêm trình xử lý' TextChanged'. – aphoria

+0

Bạn hoàn toàn đúng. Nhưng không có lý do rõ ràng, khi tôi thêm mã đó vào ứng dụng thử nghiệm của tôi, nó đã ném lỗi. – Sergio

0

Tôi có nhiều Hộp văn bản bên trong nhiều Nhóm hộp bên trong TabPage-Control.

Để thêm/xác định/xóa trình xử lý của các hộp văn bản đó, tôi phải lặp lại đầu tiên thông qua Tabpages, sau đó thông qua Groupbox trong mọi Tabpage và sau đó tôi có thể truy cập Textbox bên trong các Groupbox này.

' 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 
Các vấn đề liên quan