在一个处理程序中处理所有文本框事件

时间:2013-03-12 10:10:33

标签: vb.net

我知道如何处理表单中的文本框事件。但是想让这段代码更短,因为我会有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 个答案:

答案 0 :(得分:8)

您可以通过编程方式使用Controls.OfType + AddHandler。例如:

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

所有人的一个处理程序:

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

答案 1 :(得分: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

答案 2 :(得分:3)

如果您使用Designer创建了非常文本框,我认为没有更好的方法。

但是,如果您已动态创建文本框,则应以这种方式添加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

答案 3 :(得分:0)

最佳方式是继承TextBox,覆盖其OnTextChanged method以添加自定义处理代码,然后在表单上使用它而不是内置的TextBox控件。

这样,事件处理代码的所有都在一个地方,你就增加了抽象。行为遵循并在控件类本身内定义,而不是包含控件的表单。当然,它可以让你摆脱一堆丑陋,难以维护的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控件。