当用户右键单击我的数据网格视图时,我有一个名为:DGVContextStrip
的ContextMenuStrip。
该MenuStrip包含一个名为AddUpgradeTagToolStripMenuItem
的项包含子项(下拉项(,这些子项的名称中都有一个数字。例如:Add1ToolStripMenuItem
、Add2ToolStripMenuItem
、Add3ToolStripMenuItem
。。。。依此类推直到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