Vb.net ToolStripMenueParator防止以编程方式禁用/启用ToolStripMenuItems

Vb.net ToolStripMenueParator防止以编程方式禁用/启用ToolStripMenuItems,vb.net,Vb.net,例如,我使用下面这部分代码来禁用标记为M2的ToolStripMenuItems。问题在于,代码在满足第一个ToolStripMenuSeparator之前一直有效。即使ToolStripMenueParator下的ToolStripMenuItems将M2作为标记,仍保持启用状态。如果我手动删除ToolStripMenuSeparator,一切正常!!!如果菜单项之间有分隔符,有什么区别吗 Dim MenuItem As ToolStripMenuItem For Each MenuI

例如,我使用下面这部分代码来禁用标记为M2的ToolStripMenuItems。问题在于,代码在满足第一个ToolStripMenuSeparator之前一直有效。即使ToolStripMenueParator下的ToolStripMenuItems将M2作为标记,仍保持启用状态。如果我手动删除ToolStripMenuSeparator,一切正常!!!如果菜单项之间有分隔符,有什么区别吗

Dim MenuItem As ToolStripMenuItem
    For Each MenuItem In MainForm_MenuStrip.Items
        If (MenuItem.GetType() Is GetType(ToolStripMenuItem)) Then
            Dim MenuSubItem As ToolStripMenuItem
            For Each MenuSubItem In MenuItem.DropDownItems
                If (MenuSubItem.GetType() Is GetType(ToolStripMenuItem)) And MenuSubItem.Tag = "M2" Then
                    MenuSubItem.Enabled = False
                End If
            Next
        End If
    Next
主要问题是ToolStripSeparator无法强制转换为ToolStripMenuItem。 因此,当循环到达ToolStripSeparator时,以下行将抛出InvalidCastException:

如果您改为强制转换为ToolStripItem,它将正常工作。 此外,应该将MenuItem定义为Object,否则一旦菜单中出现ToolStripTextbox或ToolStripCombobox,代码就会失败。此外,GetType部件也可以替换为TypeOf

本例使用后期绑定。 以下内容也适用于Option Strict On:

For Each MenuSubItem In MenuItem.DropDownItems
For Each MenuItem As Object In Mainform_MenuStrip.Items
    If TypeOf MenuItem Is ToolStripMenuItem Then
        For Each MenuSubItem As ToolStripItem In MenuItem.DropDownItems
            If TypeOf MenuSubItem Is ToolStripMenuItem AndAlso MenuSubItem.Tag = "M2" Then
                MenuSubItem.Enabled = False
            End If
        Next
    End If
Next
For Each MenuItem As ToolStripItem In Mainform_MenuStrip.Items
    If TypeOf MenuItem Is ToolStripMenuItem Then
        For Each MenuSubItem As ToolStripItem In DirectCast(MenuItem, ToolStripMenuItem).DropDownItems
            If TypeOf MenuSubItem Is ToolStripMenuItem AndAlso CStr(MenuSubItem.Tag) = "M2" Then
                MenuSubItem.Enabled = False
            End If
        Next
    End If
Next