winforms 如何在一条语句中找到被单击按钮的文本?

lawou6xi  于 2023-01-14  发布在  其他
关注(0)|答案(1)|浏览(168)

所以,基本上,我在给这个虚拟键盘编程,我必须为每个键单独写代码,也就是按钮。
这是可笑的乏味,我想知道是否有可能有一个单一的语句,可以找到文本的关键(Button)按下。
我现在的代码是这样的:

textbox.TextBox1.Text = textbox.TextBox1.Text + zh.Text

zh是用于上下文的Button的名称。
现在,我必须在每个Button的Click事件中反复复制和粘贴这个代码字符串。
我认为有一种方法可以让代码捕获我按下的任何Button的文本,然后将该文本发送到TextBox
如果这是可行的话,有没有人知道怎样做呢?

mpgws1up

mpgws1up1#

    • 方法1**:

使用设计器,将单个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 * 委托在代码中创建一个事件处理程序,并将其分配给所有Button
AddHandler [Event], AddressOf [HandlerMethodName]
假设您的Button有一个公共的部分名称,这里是**"btnKey"**。
您还可以使用Tag属性,并为Keys Buttons指定一个特定值。
然后在Where()中写入:b.Tag.ToString().Contains("[Some Common Identifier]").
注意,Tag属性值的类型是Object,因此Contains()只是一个普通的例子,它可以计算为Integer类型或其他类型。

    • 注1:**要为所有按键分配一个通用标识符,您可以使用表单设计器:选择所有按钮并使用"属性"窗口更改所有选定按钮的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在注解中建议的那样,这里使用DirectCast()操作符执行强制转换,因为sender一个Button,而且Button也是从Control派生的。您可以使用 * 轻量级 * DirectCast()来 * 查看 * sender作为按钮或控件(因为Button派生自Control,而Text属性继承自Control)并访问其Text属性。
来自文档:
[DirectCast()](...)在与数据类型Object相互转换时,它可以提供比CType稍好的性能。
我在第一个示例中保留CType()作为视觉辅助。
VB.NET中DirectCast()与CType()的区别

    • 方法3**:

在代码中创建一个事件处理程序,并使用Lambda作为方法委托将其分配给所有Button:

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

相关问题