You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据变量名称查找ToolStripItem并修改其Checked属性

问题原因
  • 直接将控件名称字符串通过CType强制转换为控件实例的语法不成立,无法通过字符串直接映射到控件对象
  • Me.Controls.Find仅能检索窗体Controls集合下的标准控件,ToolStripMenuItem属于菜单组件的子项,不在窗体控件集合内,因此无法检索到对应菜单项
解决代码

推荐直接从父菜单项的下拉项集合中查找对应名称的子项,完整实现逻辑如下:

' 建议写在DGVContextStrip的Opening事件中,菜单弹出前执行逻辑
Private Sub DGVContextStrip_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles DGVContextStrip.Opening
    ' 前置校验:避免无选中行、单元格值为空时报错
    If DataGridView1.SelectedRows.Count = 0 Then Exit Sub
    Dim cellValue = DataGridView1.SelectedRows(0).Cells("Text_Field").Value
    If cellValue Is Nothing OrElse String.IsNullOrWhiteSpace(cellValue.ToString()) Then Exit Sub
    Dim content As String = cellValue.ToString()

    ' 先重置所有子项的选中状态,避免残留上次的选中结果
    For Each item In AddUpgradeTagToolStripMenuItem.DropDownItems.OfType(Of ToolStripMenuItem)
        item.Checked = False
    Next

    ' 遍历匹配数字并设置选中
    For i = 1 To 25
        If content.Contains(i.ToString()) Then
            Dim targetItem = AddUpgradeTagToolStripMenuItem.DropDownItems.Find("Add" & i & "ToolStripMenuItem", False).FirstOrDefault()
            If targetItem IsNot Nothing Then
                CType(targetItem, ToolStripMenuItem).Checked = True
            End If
        End If
    Next
End Sub
优化方案(可选)

如果需要频繁触发该逻辑,可以在窗体加载时提前将所有编号菜单项存入字典,避免每次遍历查找,性能更优:

' 窗体级变量存储菜单项映射
Private upgradeTagMenuDict As New Dictionary(Of Integer, ToolStripMenuItem)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 初始化时存入字典
    For i = 1 To 25
        Dim item = CType(AddUpgradeTagToolStripMenuItem.DropDownItems.Find("Add" & i & "ToolStripMenuItem", False).FirstOrDefault(), ToolStripMenuItem)
        If item IsNot Nothing Then
            upgradeTagMenuDict.Add(i, item)
        End If
    Next
End Sub

' 后续使用时直接从字典取值即可
Private Sub DGVContextStrip_Opening(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles DGVContextStrip.Opening
    If DataGridView1.SelectedRows.Count = 0 Then Exit Sub
    Dim cellValue = DataGridView1.SelectedRows(0).Cells("Text_Field").Value
    If cellValue Is Nothing OrElse String.IsNullOrWhiteSpace(cellValue.ToString()) Then Exit Sub
    Dim content As String = cellValue.ToString()

    For Each kv In upgradeTagMenuDict
        kv.Value.Checked = content.Contains(kv.Key.ToString())
    Next
End Sub

内容的提问来源于stack exchange,提问作者Andy Andromeda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 00:15:09