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