方法一:
使用设计器,将单个 Click 事件分配给所有 Button,然后使用 sender 对象,将其转换为 Button 或 Control:
Private Sub MyKeys_Click(sender As Object, e As EventArgs) Handles MyKeysA.Click, MyKeysB.Click, (...)
TextBox1.AppendText(CType(sender, Button).Text)
End Sub
但是最终的事件处理程序会附加很多 Buttons 引用。不是美女。
方法二:
在代码中创建一个事件处理程序并将其分配给您的所有按钮,使用 classic 委托,
AddHandler [Event], AddressOf [HandlerMethodName]
假设您的 Button 有一个共同的部分名称,此处为 "btnKey"。
您还可以使用 Tag 属性并为您的按键按钮分配一个特定值。
然后你会写Where():b.Tag.ToString().Contains("[Some Common Identifier]")。
注意Tag 属性值是Object 类型,所以
Contains() 只是一个通用示例。它可以评估为
整数类型或其他任何类型。
注意 1: 要为所有 Keys Buttons 分配一个公共标识符,您可以使用表单设计器:选择所有 Buttons 并使用 Properties Window 更改所有 Keys Buttons 的 Tag 属性选定的按钮。
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("btnKey"))
AddHandler btn.Click, AddressOf Me.MyKeys_Click
Next
End Sub
Private Sub MyKeys_Click(sender As Object, e As EventArgs)
TextBox1.AppendText(DirectCast(sender, Control).Text)
End Sub
注2:
正如 Andrew Morton 在 cmets 中建议的那样,这里的演员表是使用 DirectCast() 运算符执行的。由于sender 是 Button 并且Button 派生自Control,您可以使用轻量级 DirectCast() 来查看 sender作为 Button 或 Control(因为 Button 派生自 Control,Text 属性继承自 Control)并访问其 Text 属性。
来自文档:
[DirectCast()] (...) 它可以提供比 CType 更好的性能
在数据类型 Object 之间转换时。
我将在第一个示例中留下CType() 作为视觉助手。
Difference between DirectCast() and CType() in VB.NET
方法3:
在代码中创建一个事件处理程序,并使用 Lambda 作为方法委托将其分配给您的所有按钮:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("btnKey"))
AddHandler btn.Click, Sub() TextBox1.AppendText(btn.Text)
Next
End Sub