Vb.net 在一个处理程序中处理所有textbox事件
我知道如何处理表单中的文本框事件。但是我想把这段代码缩短,因为我需要30个文本框。使用此选项效率低下: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.
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的: