使用名称属性调用控件,然后将事件添加到其中



我有几个通过编程创建的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

我能够获得控件的名称。谢谢!

最新更新