2008-10-07 4 views
7

VB 2008어떻게 동일한 이벤트 핸들러와 폼의 모든 텍스트 상자 컨트롤을 연결하는

I 양식에 여러 텍스트 상자를 가지고 있고이 동일한 이벤트 핸들러를 사용하도록 각을합니다. 수동으로 핸들러에 연결하는 방법을 알고 있지만 좀 더 일반적인 방법을 찾고 있으므로 텍스트 상자를 추가하면 이벤트 처리기에 자동으로 연결됩니다.

아이디어가 있으십니까?

편집 :

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 

고마워 : (닉 남긴 코멘트의 도움으로), 나는이 VB 코드를 작성 MusiGenesis에서의 C# 샘플을 사용! 너무 좋습니다.

답변

9

폼의로드 이벤트에서이 같은 작업을 수행 (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

상기 equivolent "If myControl.HasChildren Then UpdateControls (myControl)"라고 말할 수 있습니다. – Nick

0

매크로를 사용하는 것이 가능할 수도 있지만, 그렇지 않으면 컨트롤을 일반 핸들러에 자동으로 연결하는 것을 인식하지 못합니다.

내가 알고있는 유일한 쉬운 방법은 적용 가능한 모든 텍스트 상자를 선택하고 동시에 click 이벤트에 대한 이벤트 핸들러를 설정하는 것입니다.하지만 이는 자동이 아닙니다.

2

폼의 OnLoad에서 Controls 컬렉션을 반복적으로 반복하고 찾을 수있는 텍스트 상자에 이벤트 처리기를 할당 할 수 있습니다.

+0

VB.NET에서이 작업을 수행하는 코드를보고 싶습니다. 이러한 종류의 작업은 Delphi에서 매우 쉽지만 VB.NET에서 아직 명확하게 수행하지 못했습니다. me.controls 의 각 제어를 들어 C가 – JosephStyons

+1

과 typeof C는 c.textchanged 입력란 c.addhandler 경우 AddressOf를 textboxhandler 최종면 + = 이벤트에 사용되는 AddHandler에 –

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

VB.NET에서 다음 – MusiGenesis

3

"c As Control"에는 "TextChanged"이벤트가 없으므로 오류가 발생합니다. 당신은 Linq에 해당을 최적화 할 수 있으며, 또한 함께 그 오류를 제거 :

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

하지만 그 첫 번째 수준 그대보다 더 깊은 가고 피할 것이다.

+0

'TextChanged' 핸들러를 추가하기 전에 컨트롤의 유형 ('If TypeOf c TextBox Then')을 검사하기 때문에 오류가 없습니다. – aphoria

+0

당신은 완전합니다. 하지만 명백한 이유가 없기 때문에 테스트 애플리케이션에 코드를 추가하면 오류가 발생합니다. – Sergio

0

TabPage 컨트롤 안에 많은 그룹 상자 안에 많은 텍스트 상자가 있습니다.

텍스트 상자의 핸들러를 추가/정의/삭제하려면 먼저 탭 페이지를 반복 한 다음 모든 탭 페이지의 그룹 상자를 통해이 그룹 상자 내의 텍스트 상자에 액세스해야합니다.

' 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 
관련 문제