如何使用click事件的名称作为字符串调用click事件?



我有一个列表框与点击事件的名称。
我想循环遍历列表框并执行每个事件。

Private Sub btnRunSelectedRoutines_Click(sender As Object, e As EventArgs) Handles btnRunSelectedRoutines.Click
For i As Integer = 0 To ListBoxSelectedButtons.Items.Count - 1
ListBoxSelectedButtons.Items(i).ToString_Click(sender, New System.EventArgs)
Next
End Sub

我用下面的方法调用click事件,没有问题。

Private Sub btnRunSelectedRoutines_Click(sender As Object, e As EventArgs) Handles btnRunSelectedRoutines.Click
btnA_Click(sender, New System.EventArgs)
btnB_Click(sender, New System.EventArgs)
btnC_Click(sender, New System.EventArgs)
End Sub

列表框中的名称如上面的示例" btnna, btnB, btnC">

问题是:
是否有一种方法调用点击事件与值从列表框(字符串)?

您可以向ListBox添加任何类型的项目,而不仅仅是字符串。让我们为此创建一个类:

Private Class EventHandlerDisplay
Public ReadOnly Property Text As String
Public ReadOnly Property Click As EventHandler
Public Sub New(text As String, click As EventHandler)
Me.Text = text
Me.Click = click
End Sub
Public Overrides Function ToString() As String
Return Text
End Function
End Class

它有两个属性。一个用于文本,一个用于事件处理程序。文本也在ToString中返回。

现在,我们可以像这样将事件处理程序添加到列表框中

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
ListBoxSelectedButtons.Items.
Add(New EventHandlerDisplay("BtnA_Click", AddressOf BtnA_Click))
ListBoxSelectedButtons.Items.
Add(New EventHandlerDisplay("BtnB_Click", AddressOf BtnB_Click))
ListBoxSelectedButtons.Items.
Add(New EventHandlerDisplay("BtnC_Click", AddressOf BtnC_Click))
End Sub

然后我们可以像这样调用选中的点击例程

Private Sub BtnRunSelectedRoutines_Click(sender As Object, e As EventArgs) Handles btnRunSelectedRoutines.Click
For Each item As EventHandlerDisplay In ListBoxSelectedButtons.SelectedItems
item.Click.Invoke(Me, EventArgs.Empty)
Next
End Sub

注意:默认情况下,ListBox通过调用它们的ToString方法来显示项目。这就是为什么我们重写了上面的ToString

我们将Click例程存储为委托。因此,我们不必按名称调用例程或使用Reflection。我们可以直接调用委托。

是的,你可以使用反射:

Imports System.Reflection

[…]

Dim mInfo As MethodInfo
For i As Integer = 0 To ListBoxSelectedButtons.Items.Count - 1
mInfo = GetType(ContainerClass).GetMethod(ListBoxSelectedButtons.Items(i).ToString())
mInfo.Invoke()
Next

阅读一些文档:https://learn.microsoft.com/en-us/dotnet/api/system.type.getmethod?view=net-6.0

当然你也可以对表单中的控件数组进行筛选然后点击想要的

(记得导入System.Link)

Dim cButtons = Controls.OfType(Of Button).Where(Function(c) ListBoxSelectedButtons.Items.Contains(c.Name))
For Each bt In cButtons 
bt.PerformClick()
Next

最新更新