【问题标题】:Identify buttons on click?点击时识别按钮?
【发布时间】:2025-12-28 14:00:12
【问题描述】:

这就是我所拥有的:

当您单击“新按钮”按钮 (Button1) 时生成按钮的代码。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ActionsMade = ActionsMade + 1

        Dim actionButton = New Windows.Forms.Button
        ActionContainer.Controls.Add(actionButton)
        actionButton.Text = "New Action " + ActionsMade.ToString
        actionButton.Width = 107
        actionButton.Height = 56

        AddHandler actionButton.Click, AddressOf OnActionButtonClick
    End Sub

当您单击已创建的按钮时,它会显示一个输入框,您可以在其中键入要将按钮重命名为的内容。

Sub OnActionButtonClick()
    If IsRenaming Then
        Dim renameTo As String
        renameTo = InputBox("Rename ActionButton To:")
    Else
        MessageBox.Show("Action started! Not renaming")
    End If
End Sub

唯一的问题是,我无法识别这些按钮。

tl;博士:

  • 我以编程方式创建了按钮
  • 我想重命名它们
  • 我不知道如何识别这些按钮并分别重命名它们

【问题讨论】:

  • 给每个按钮一个唯一的名称:actionButton.Name = button1; 等。然后您可以在容器中搜索具有该名称的按钮。

标签: vb.net


【解决方案1】:

这更简洁,包括一个可引用的按钮名称(例如Button_03):

Private Sub MakeButton_Click(sender As Object, e As EventArgs) Handles MakeButton.Click

    Static ActionsMade As Integer = 0
    ActionsMade += 1
    ActionContainer.Controls.Add(New Button With {
        .Name = $"Button_{ActionsMade:00}",
        .Text = $"New Action {ActionsMade:00}",
        .Size = New Size(107, 56),
        .Location = New Point(100, 250 + 25 * ActionsMade)
    })
    AddHandler ActionContainer.Controls($"Button_{ActionsMade:00}").Click, AddressOf OnActionButtonClick
End Sub

请注意,在上面的代码中,我实际上并没有定义一个新按钮本身,只是在Controls.Add() 语句中New-ed它,然后使用生成的按钮名称以添加事件处理程序。

另一种方法是将按钮声明为独立对象,然后添加它:

Dim actionButton As New Button With {
    .Name = $"Button_{ActionsMade:00}",
    .Text = $"New Action {ActionsMade:00}",
    .Size = New Size(107, 56),
    .Location = New Point(100, 250 + 25 * ActionsMade)
}
ActionContainer.Controls.Add(actionButton)
AddHandler actionButton.Click, AddressOf OnActionButtonClick

其他说明:

  1. 使用Static ActionsMade 整数变量,在调用之间保持其值。这也可以是模块范围的变量,并从 MakeButton_Click Sub 中删除。

  2. 根据ActionsMade 值的格式化版本,在分配按钮的NameText 属性时使用字符串插值。

  3. 使用按钮属性SizeLocation

  4. 根据ActionsMade的值自动增加按钮垂直位置。

关于您的操作按钮事件处理程序,它应该如下所示:

Private Sub OnActionButtonClick(sender As Object, e As EventArgs)

    If ActionStarted Then
        MessageBox.Show("Action started! Not renaming.")
    Else
        CType(sender, Button).Text = InputBox("Rename ActionButton To:")
    End If
End Sub

请注意,我检查的是已启动的操作,而不是正在进行的重命名,但这只是一种替代方法的说明。另请注意,您无需知道按钮的名称即可更改其属性。

【讨论】: