如何根据名称作为变量找到toolstripitem,然后更改其选中的值

How to find a toolstripitem based on its name being a variable and then change the checked value of it

我有一个名为:DGVContextStrip 的 ContextMenuStrip,它在用户右键单击我的数据网格视图时显示。

该 MenuStrip 包含一个名为 AddUpgradeTagToolStripMenuItem 的项目 其中包含子项(下拉项),这些子项都以名称中的数字命名。 例如:Add1ToolStripMenuItemAdd2ToolStripMenuItemAdd3ToolStripMenuItem...等等,直到 Add25ToolStripMenuItem.

当用户在 Datagridview 上右键单击时,我想检查单元格是否包含数字“1”,如果确实包含数字“1”,则 Add1ToolStripItem.checked = true

我想我会遍历数字 1 到 25,并在每个循环中检查单元格是否包含 1,如果为真,则更改菜单项的选中值。像...

For i = 1 to 25
  If DataGridView1.SelectedRows(0).Cells("Text_Field").Value.ToString.Contains(i) then
  CType("Add" & i & "ToolStripMenuItem", ToolStripMenuItem).Checked = True

Next

但这不起作用,我在网上看到了使用 control.find 方法的示例,但我无法使用它。 例如

Dim ControlName As String = "Add" & i & "ToolStripMenuItem"
CType(Me.Controls.Find(ControlName, True), ToolStripMenuItem).Checked = True

有什么想法可以让它发挥作用吗?我意识到我可以使用 25 个 if then else 语句,但我有点想让代码更整洁。

ToolStripItem不是一个控件,要在Control.ControlCollection中搜索一个。您需要在它所属的地方搜索 ToolStripItemCollection

就像Control.ControlCollection.Find方法一样,ToolStripItemCollection.Find方法可以对项目进行深度搜索。

您的案例示例:

Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = yourContextMenuStrip.Items.
    Find(itemName, True).
    OfType(Of ToolStripMenuItem).
    FirstOrDefault()

If tsmi IsNot Nothing Then
    tsmi.Checked = True
End If

或者,如果您已经知道目标项目是 AddUpgradeTagToolStripMenuItem 下拉项目之一,那么您可以:

Dim itemName As String = $"Add{i}ToolStripMenuItem"
Dim tsmi = DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
    DropDownItems.OfType(Of ToolStripMenuItem).
    FirstOrDefault(Function(x) x.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase))

If tsmi IsNot Nothing Then
    tsmi.Checked = True
End If

如果您只需要检查集合中的一项:

Dim itemName As String = $"Add{i}ToolStripMenuItem"

For Each tsmi In DirectCast(AddUpgradeTagToolStripMenuItem, ToolStripMenuItem).
    DropDownItems.OfType(Of ToolStripMenuItem)

    If tsmi.Name.Equals(itemName, StringComparison.OrdinalIgnoreCase) Then
        tsmi.Checked = True
    Else
        tsmi.Checked = False
    End If
Next