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

一个处理程序:

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在面板(PnlTextBoxes)中有 30 个,现在您可以handlertextboxes下面这样动态地创建

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

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

但是,如果您已经动态创建了文本框,您应该以这种方式添加处理程序:

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

最好的方法是继承 from TextBox,覆盖其OnTextChanged方法以添加您的自定义处理代码,然后在您的表单上使用它而不是内置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具有内置的所有行为。

于 2013-03-12T10:17:23.570 回答