如何根据变量名称查找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
相关产品推荐
相关产品推荐

