2017-07-10 7 views
1

のフォーカスを失ったとき、私は私のForm.vb上で、これを持っている:を実行し、いくつかのコードリスト上の任意のコントロールが現在

Private Sub txtBox1_Leave(sender As Control, e As EventArgs) Handles txtBox1.Leave 
     'Some code 
    End Sub 

... 
    Private Sub txtBox10_Leave(sender As Control, e As EventArgs) Handles txtBox10.Leave 
     'Some code 
    End Sub 

私を悩ます事は次のとおりです。すべてのこれらのイベントは、同じことをやっています。関連するコントロールのリストをプログラム的に作成し、それらのイベントを追加して反復することは可能ですか?これにより、アプリケーション/コーディングの労力を軽減できます。ような何か:

For Each c As Control in listOfControls 
    'Add event for c here which calls method 
Next 

は、私は本当にそれを行うための簡単な方法があると思いますが(などのAddHandlerなど)私がこれまで試したすべてがうまくいきませんでした。何か案は?

はありがとう

+0

メソッドに '' some code'を入れ、どこからでも呼び出すか、すべて同じイベントハンドラに接続します。 'For Each'は、コントロールが何かをトリガしたときに何度もコードを実行したくないので問題になります – Plutonix

+0

@Plutonix' For Each'はイベントをコントロールにプログラマチックに追加するだけです各コントロールの各イベントハンドラをタイプすることにより、コード自体が必要なすべてのものに自動的に追加されます。 – Renato

+0

'Handles txtBox10.Leave、txtBox10.Leave、txtBox1.Leave、txtBox107.Leave、txtBox121.Leave、txtBox90.Leave ... ' – Plutonix

答えて

1

はい、それは可能と非常に簡単です、Controlに要求されたイベントを追加するメソッドを作成し、フォームがロードされる前に、そのメソッドへのコントロールの配列を渡す:

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     ' add events to all requested controls 
     AddEvent(New Control() {TextBox1, TextBox2, TextBox3, Button1}) 
    End Sub 

    Public Sub AddEvent(ByVal myControls() As Control) 
     For Each c As Control In myControls 
      AddHandler c.Leave, AddressOf Control_Leave 
     Next 
    End Sub 

    Private Sub Control_Leave(sender As Object, e As EventArgs) 
     MsgBox("Control is not in focus") 
    End Sub 

End Class 
+0

ありがとう、私はコメントから集まって、それがきれいに働いたように、私はまさにそれをしました。あなたの答えを受け入れて、それを実際の解決策としてマークします。 – Renato

関連する問題