Vb.net 如何在一条语句中查找单击按钮的文本?

Vb.net 如何在一条语句中查找单击按钮的文本?,vb.net,winforms,Vb.net,Winforms,因此,基本上,我正在为这个虚拟键盘编程,我必须为每个键(即按钮)分别编写代码。 这太无聊了,我想知道是否有一条语句可以找到按键(按钮)的文本。 我当前的代码如下: textbox.TextBox1.Text = textbox.TextBox1.Text + zh.Text zh是用于上下文的按钮的名称。 现在,我必须在每个按钮的点击事件中一遍又一遍地复制和粘贴这串代码。 我认为有一种方法可以让代码抓取我按下的任何按钮的文本,然后将该文本发送到文本框 如果这确实可行,有人知道怎么做吗?方法1:

因此,基本上,我正在为这个虚拟键盘编程,我必须为每个键(即按钮)分别编写代码。
这太无聊了,我想知道是否有一条语句可以找到按键(
按钮
)的文本。

我当前的代码如下:

textbox.TextBox1.Text = textbox.TextBox1.Text + zh.Text
zh
是用于上下文的
按钮的名称。

现在,我必须在每个按钮的
点击
事件中一遍又一遍地复制和粘贴这串代码。
我认为有一种方法可以让代码抓取我按下的任何
按钮的文本,然后将该文本发送到
文本框


如果这确实可行,有人知道怎么做吗?

方法1
使用设计器,为所有按钮指定一个单击事件,然后使用
sender
对象,将其强制转换为按钮或控件:

Private Sub MyKeys_Click(sender As Object, e As EventArgs) Handles MyKeysA.Click, MyKeysB.Click, (...)
    TextBox1.AppendText(CType(sender, Button).Text)
End Sub
但是最终的事件处理程序将有许多按钮引用附加到它。 不是美女。

方法2
在代码中创建一个事件处理程序,并使用经典委托将其分配给所有按钮
AddHandler[Event],AddressOf[HandlerMethodName]

假设您的按钮有一个通用的部分名称,这里是“btnKey”

您还可以使用该属性并为其指定键和按钮的特定值。
然后在
Where()
b.Tag.ToString().Contains(“[一些公共标识符]”)中写入

请注意,
标记
属性值的类型为
对象
,因此
Contains()
只是一个通用示例。它可以评估为
Integer
键入或其他任何内容

注1:要为所有按键按钮分配一个公共标识符,您可以使用
窗体
设计器:选择所有按钮,并使用
属性窗口
更改所有所选按钮的
标记
属性。

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)在评论中所建议的,这里的强制转换是使用操作符执行的。由于
发送方
是一个
按钮
,而且
按钮
源自
控件
,因此您可以使用轻量级
DirectCast()
发送方
作为
按钮或
控件
(因为
按钮
派生自
控件
,而
文本
属性继承自
控件
)并访问其
文本
属性。

从文档中:
[
DirectCast()
](…)它可以提供比CType更好的性能 在转换为数据类型对象和从数据类型对象转换时

在第一个示例中,我将作为视觉助手离开。


方法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

你最好使用DirectCast而不是CType,因为你已经知道它们是按钮。进一步阅读:。@Andrew Morton嗯,是的,值得一提,因为它可以同时对按钮和控件进行转换。我将链接:)@Jimi
textbox中的textbox是什么。TextBox1
在这三种方法中都使用?@Mary我不确定。你应该问OP,它在问题的代码片段中。也许,它只是表单容器名称(它是文本编辑器表单吗?)或另一个容器控件。我只是遵循现有的模式。但这可能不是一个好主意,在一个更通用的用例场景中(也因为,显然,产生了一个问题,那是为了什么?)。我正在删除它。@Jimi谢谢,我正在把它粘贴到我的代码库中,我想知道。