我有几个通过编程创建的TEXBOX。我需要每个文本框都有一个事件,这意味着1个文本框有1个事件,与另一个事件不同。我使用名称属性为每个文本框提供一个名称,可以分开识别每个名称。
for i = 0 to 5
Dim TextBoxes As New TextBox
With TextBoxes
.Name = "InputTextBox" & i
.AutoSize = True
.Parent = FlowLayoutPanel1
End With
Next
我如何使用我在for循环中设置的名称属性,以便我可以在每个文本框中放入文本变更事件。我打算接近它的可能性吗?正确的方法是什么?
谢谢< 3
我可以建议一种更简单的方法。如果您使用单个事件处理程序,则文本框的建筑部分要容易得多。然后,在常见的文本交换事件中,您检查传递给处理程序的发件人对象并使用它来调用该文本框的特定处理程序
所以我们可以拥有
for i = 0 to 5
Dim TextBoxes As New TextBox
With TextBoxes
.Name = "InputTextBox" & i
.AutoSize = True
.Parent = FlowLayoutPanel1
End With
' Add the common handler for all textboxes
AddHandler TextBoxes.TextChanged, AddressOf onChanged
Next
在Common on Changed 事件中,您编写此代码
Sub onChanged(sender As Object, e As EventArgs)
Dim t As TextBox = CType(sender,TextBox)
Select Case t.Name
case "inputTextBox0"
HandleInputTextBox0()
case "inputTextBox1"
HandleInputTextBox1()
..... and so on....
End Select
End Sub
但是,如果您准备了一个字典,那么我们也可以摆脱该 select case ,其中每个键是您的文本框的名称,并且每个值都是为该框执行的操作
Dim dict As Dictionary(Of String, Action) = New Dictionary(Of String, Action) From
{
{"inputTextBox0", AddressOf HandleInputTextBox0},
{"inputTextBox1", AddressOf HandleInputTextBox1}
}
并将常见的文本变换处理程序更改为简单的两行代码
Sub onChanged(sender As Object, e As EventArgs)
Dim t As TextBox = CType(sender,TextBox)
dict(t.Name).Invoke()
End Sub
感谢@steve。这就是我解决问题的方式
for i = 0 to 5
Dim TextBoxes As New TextBox
With TextBoxes
.Name = "InputTextBox" & i
.AutoSize = True
.Parent = FlowLayoutPanel1
AddHandler .TextChanged, AddressOf InputPercentage
End With
Next
Friend Sub InputPercentage(sender as Object, e as EventArgs)
Dim txt As TextBox = CType(sender, TextBox)
MessageBox.Show(txt.Name)
End Sub
我能够获得控件的名称。谢谢!