Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 在一个处理程序中处理所有textbox事件_Vb.net - Fatal编程技术网

Vb.net 在一个处理程序中处理所有textbox事件

Vb.net 在一个处理程序中处理所有textbox事件,vb.net,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.

我知道如何处理表单中的文本框事件。但是我想把这段代码缩短,因为我需要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
有没有缩短处理程序的方法?

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

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

假设您在面板中有30个
文本框
PnlTextBoxes
),现在您可以像下面这样动态地为
文本框创建
处理程序

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

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

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

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
最好的方法是从
TextBox
继承,重写它以添加自定义处理代码,然后在表单上使用它,而不是在内置的
TextBox
控件上使用它

这样,所有事件处理代码都在一个地方,增加了抽象性。行为遵循并在控件类本身中定义,而不是在包含控件的窗体中定义。当然,它使您不再拥有一堆难看、难以维护的
句柄
语句,或者更糟糕的是,对于
循环,它的
速度较慢,甚至更难看

例如,将定义新自定义文本框控件的代码添加到项目中的新文件中:

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
控件,该控件内置了您的所有行为。

我想您昨天问过这个问题,也得到了一些答案。。!我正在寻找最简短的版本^ ^ ^我想,这里不需要select语句,相反,我们可以写一行这样的
MsgBox(DirectCast(sender,TextBox.Text)
:)@GLOIERTECH.:我刚刚复制了OP的代码,我假设这只是示例代码,他实际上希望以不同的方式处理这些情况。我想表明,可以识别原始的
文本框(尽管OP已经知道)。好的:),我是这个网站的新手,我看到这里的很多人都在使用“OP”这个词,这是什么意思?(完整形式)这里是一个概述(包括OP):这里是专门针对OP的: