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