3

フォームでテキストボックスのイベントを処理する方法を知っています。しかし、テキストボックスを 30 個にするので、このコードを短くしたいと思います。これを使用するのは非効率的です:

Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged, TextBox4.TextChanged, TextBox5.TextChanged, TextBox6.TextChanged, TextBox7.TextChanged, TextBox8.TextChanged, TextBox9.TextChanged, TextBox10.TextChanged
    Dim tb As TextBox = CType(sender, TextBox)

    Select Case tb.Name
        Case "TextBox1"
            MsgBox(tb.Text)
        Case "TextBox2"
            MsgBox(tb.Text)
    End Select
End Sub

ハンドラを短くする方法はありますか?

4

4 に答える 4

9

Controls.OfType+ をプログラムで使用できますAddHandler。例えば:

Dim textBoxes = Me.Controls.OfType(Of TextBox)()
For Each txt In textBoxes
    AddHandler txt.TextChanged, AddressOf txtTextChanged
Next

すべてに対して 1 つのハンドラー:

Private Sub txtTextChanged(sender As Object, e As EventArgs)
    Dim txt = DirectCast(sender, TextBox)
    Select Case txt.Name
        Case "TextBox1"
            MsgBox(txt.Text)
        Case "TextBox2"
            MsgBox(txt.Text)
    End Select
End Sub
于 2013-03-12T10:14:56.077 に答える
3

textboxesパネル( )内にその30がある場合、次のように動的にPnlTextBoxes作成できhandlerますtextboxes

For each ctrl in PnlTextBoxes.controls
 If TypeOf ctrl is TextBox then
   AddHandler ctrl.TextChanged, AddressOf CommonClickHandler
 end if
Next


Private Sub CommonHandler(ByVal sender As System.Object, _
ByVal e As System.EventArgs)

      MsgBox(ctype(sender,TextBox).Text)

End Sub
于 2013-03-12T10:15:02.170 に答える
3

Designer で非常に Textbox を作成した場合、これ以上の方法はないと思います。

ただし、Textbox を動的に作成した場合は、次のように AddHandler を作成する必要があります。

For i = 0 to 30
    Dim TB as New Texbox
    AddHandler TB.TextChanged, TextBox1_TextChanged
    'Set every Property that you need
    Me.Controls.Add(TB)
Next
于 2013-03-12T10:15:27.247 に答える
0

から継承し、そのメソッドをオーバーライドしてカスタム処理コードを追加し、組み込みコントロールの代わりにそれをフォームで使用するのが最善の方法です。TextBoxOnTextChangedTextBox

そうすれば、すべてのイベント処理コードが 1 つの場所にあり、抽象化が向上します。動作は、コントロールを含むフォームではなく、コントロール クラス自体の中で定義されます。そしてもちろん、醜くて保守が難しいHandlesステートメントの束や、さらに悪いことに、遅くてさらに醜いForループから解放されます。

たとえば、新しいカスタム テキスト ボックス コントロールを定義する次のコードをプロジェクトの新しいファイルに追加します。

Public Class CustomTextBox : Inherits TextBox

    Protected Overridable Sub OnTextChanged(e As EventArgs)
        ' Do whatever you want to do here...
        MsgBox(Me.Text)

        ' Call the base class implementation for default behavior.
        ' (If you don't call this, the TextChanged event will never be raised!)
        MyBase.OnTextChanged(e)
    End Sub

End Class

次に、再コンパイルした後、既存のコントロールを、すべての動作が組み込まれTextBoxた新しく定義されたコントロールに置き換えることができるはずです。CustomTextBox

于 2013-03-12T10:17:23.570 に答える