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

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

有没有一种方法可以缩短处理程序的长度?

3
我想你昨天问了这个问题,并且也得到了一些答案..! - Rajaprabhu Aravindasamy
我正在寻找最简洁的版本 ^_^ - conquistador
4个回答

9

您可以在程序中使用Controls.OfTypeAddHandler。例如:

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

2
我认为在这里使用 select 语句是不必要的,我们可以像这样写一行代码 MsgBox( DirectCast(sender, TextBox).Text) :) - Rajaprabhu Aravindasamy
2
@GLOIERTECH:我刚刚复制了OP的代码,我认为那只是示例代码,他实际上想以不同的方式处理这些情况。我想展示的是,可以识别出原始的“TextBox”(尽管OP已经意识到了这一点)。 - Tim Schmelter
好的 :) ,我是新来这个网站的,我看到这里很多人都在使用一个叫做“OP”的词,那是什么意思?(全称) - Rajaprabhu Aravindasamy
这是一个概述(包括OP):http://meta.stackexchange.com/questions/40353/stack-exchange-glossary-dictionary-of-commonly-used-terms,这里特别针对OP:http://meta.stackexchange.com/questions/79804/whats-stackexchange-ese-for-op - Tim Schmelter

3

假设您在一个面板(PnlTextBoxes)中有30个文本框(textboxes),现在可以按照以下方式动态创建您的 textboxes 的处理程序(handler):

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

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

0

最好的方法是从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

然后,在重新编译之后,您应该能够用新定义的CustomTextBox控件替换现有的TextBox控件,并且该控件具有您构建的所有行为。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接