如何根据toolstripitem的名称作为变量来查找它,然后更改它的检查值



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

该MenuStrip包含一个名为AddUpgradeTagToolStripMenuItem的项包含子项(下拉项(,这些子项的名称中都有一个数字。例如:Add1ToolStripMenuItemAdd2ToolStripMenuItemAdd3ToolStripMenuItem。。。。依此类推直到CCD_ 6。

当用户右键单击Datagridview时,我想检查一个单元格是否包含数字";1〃;那么如果它确实使Add1ToolStripItem.checked = true

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

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

最新更新