如何根据名称作为变量找到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
的项目
其中包含子项(下拉项),这些子项都以名称中的数字命名。
例如:Add1ToolStripMenuItem
、Add2ToolStripMenuItem
、Add3ToolStripMenuItem
...等等,直到 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
我有一个名为:DGVContextStrip
的 ContextMenuStrip,它在用户右键单击我的数据网格视图时显示。
该 MenuStrip 包含一个名为 AddUpgradeTagToolStripMenuItem
的项目
其中包含子项(下拉项),这些子项都以名称中的数字命名。
例如:Add1ToolStripMenuItem
、Add2ToolStripMenuItem
、Add3ToolStripMenuItem
...等等,直到 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