1

i would like to uncheck all menu items of a main ToolStripMenuItem (called MyMainMenu) in a MenuStrip when i click on another menu entry. The main menu contains some menu items and a separator. I tried the following code:

Private Sub CheckCheckedStatusMenu(ByVal MnuItem As ToolStripMenuItem)
  MnuItem.Checked = True

  For Each Mnu As ToolStripMenuItem In Me.MyMainMenu.DropDownItems
    If Not Mnu Is MnuItem Then
      Mnu.Checked = False
    End If
  Next
End Sub

I call that code from every menu item (except the separator). When i click on a menu item, the program crash saying that he can't make the cast from ToolStripSeparator to ToolStripMenuItem. The same code can be found on the Microsoft .NET documentation site for similar purposes, but it does not specify what can be done in case the same menu item contains different kind of items (separators, textboxes...).

Do you know how can i fix this problem?

Thanks,

Bye

Matt Wilko
  • 26,994
  • 10
  • 93
  • 143
hawake
  • 37
  • 9
  • Thank you very much to both! I used the solution posted by Matt Wilko since it seems simpler. It works. ;) – hawake Nov 26 '15 at 20:18

1 Answers1

0

Your code assumes that the DropDownItems only returns items of Type ToolStripmenuItem, but it in fact returns a ToolstripItemCollection

So you need an extra check to make sure you are only working with the types you are interested in:

Private Sub CheckCheckedStatusMenu(ByVal MnuItem As ToolStripMenuItem)
    MnuItem.Checked = True

    For Each item In Me.MyMainMenu.DropDownItems
        If TypeOf item Is ToolStripMenuItem Then
            Dim mnu = CType(item, ToolStripMenuItem)
            If Not mnu Is MnuItem Then
                mnu.Checked = False
            End If
        End If
    Next
End Sub

Probably a better option though is to filter your original collection to only return objects of a particular type:

Private Sub CheckCheckedStatusMenu(ByVal MnuItem As ToolStripMenuItem)
    MnuItem.Checked = True

    For Each mnu In Me.MyMainMenu.DropDownItems.OfType(Of ToolStripMenuItem)
        If Not mnu Is MnuItem Then
            mnu.Checked = False
        End If
    Next
End Sub

Note that you can further simplify your routine to check only the item that is being passed in:

Private Sub CheckCheckedStatusMenu(ByVal MnuItem As ToolStripMenuItem)
    For Each mnu In Me.MyMainMenu.DropDownItems.OfType(Of ToolStripMenuItem)
        mnu.Checked = (mnu Is MnuItem)
    Next
End Sub
Matt Wilko
  • 26,994
  • 10
  • 93
  • 143