代码之家  ›  专栏  ›  技术社区  ›  E.J. Brennan

WinForms菜单作为数组

  •  0
  • E.J. Brennan  · 技术社区  · 15 年前

    我知道很可能访问类似数组的WinForms菜单,但在VS2008的菜单设计器中看不到它。我的意思是,我的应用程序在顶部有一个典型的菜单栏,每个下拉菜单上都有多个项目。在编写过程中(我继承了这段代码),每个菜单项都是一个单独的名称,即

    myMenuOption1MenuItem
    myMenuOption2MenuItem
    myMenuOption3MenuItem
    myMenuOption4MenuItem
    

    等。。。

    我需要能够根据用户权限启用或禁用(甚至隐藏/取消隐藏)菜单选项,例如:

    For I = 0 to maxIndex
        myMenuOption(I).Enabled = myUser.IsAdministrator
    Next
    

    显然,我可以按名称设置/取消设置每个菜单项,但出于很多原因,我更喜欢使用循环。

    3 回复  |  直到 13 年前
        1
  •  2
  •   Factor Mystic    15 年前

    ToolStripMenuItem S通过 ContextMenuStrip.Items

    For Each myItem As ToolStripMenuItem In myContextMenuStrip.Items
        myItem.Enabled = myUser.IsAdministrator
    Next
    
        2
  •  1
  •   Brody    15 年前

    每个子菜单项都在DropDownitems集合中,因此您可以循环使用该集合(如果您使用的是ToolStripMenuItem,而不是较旧的样式菜单)。

        3
  •  0
  •   casperOne    13 年前
    For Each Menu As ToolStripMenuItem In MenuPrincipal.Items
    
        For Each Item As ToolStripItem In Menu.DropDownItems
            If TypeOf (Item) Is ToolStripMenuItem Then
                AddHandler Item.Click, AddressOf Menu_OnClick
            End If
    
        Next
    
    Next
    

    通过这种方式,您可以访问以下每个事件:

    Private Sub Menu_OnClick(ByVal sender As Object, ByVal e As System.EventArgs)
    
        Dim Frm As Form = GetFormByName(sender.name)
        If sender.Tag = "Modal" Then
            Frm.ShowDialog(Me)
        ElseIf sender.Tag = "Modeless" Then
            Frm.Show(Me)
        Else
            OpenForm(Frm, True)
        End If
    
    End Sub