首页 > 解决方案 > 如何根据名称作为变量查找工具条,然后更改它的检查值

问题描述

我有一个 ContextMenuStrip 调用:DGVContextStrip当用户右键单击我的 datagridview 时显示它。

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

当用户在 Datagridview 上单击鼠标右键时,我想检查一个单元格是否包含数字“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 语句,但我有点想让代码更整洁。

标签: vb.netcontrolscontextmenutoolstripmenu

解决方案


不是在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

推荐阅读