Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

GGerminiani

Inativando os Menus de um ToolStrip

Recommended Posts

Pessoal,

Boa tarde.

 

Estou com um problema que não encontro solução.

 

 

No Load do meu MDI, quero que todos os menus do meu TOOLSTRIP fiquem com os botões com ENABLED = FALSE...

 

Até uma certa parte consegui, mas daí o For Each encontra um SEPARETOR (que não contém ENABLED) e dá erro..

 

o código está assim:

 

    Private Sub PrincipalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load


        For Each DropDown As ToolStripDropDownButton In PriMenuToolStrip.Items
            If TypeOf DropDown Is ToolStripDropDownButton Then
                For Each controle As ToolStripMenuItem In DropDown.DropDownItems
                    If TypeOf controle Is ToolStripMenuItem Then
                        controle.Enabled = False
                    End If
                Next
            End If
        Next

    End Sub

O erro diz o seguinte:

InvalidCastException was unhandled:

Não é possível converter um objeto do tipo 'System.Windows.Forms.ToolStripSeparator' no tipo 'System.Windows.Forms.ToolStripMenuItem'.

 

Como eu disse, Debugando o procedimento eu vi que os botões antecedentes ao Separator ficaram Enabled = False...

 

Alguém pode me ajudar?

 

Grato,

Gustavo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Khaos,

Bom dia.

 

Na verdade eu precisava usar alguma função com laço, pois pretendo colocar níveis de permissões para usuários...

 

Então terei um menu "PERMISSÕES"...

 

 

Só para você entender a ideia...

Sempre que o MDI for carregado, pretendo fazer um FOR EACH para pegar todos os botões do meu menu, e então vou jogar eles para um ListCheckView dentro de GRUPOS.

 

Ou seja, vou fazer um ListView Dinâmico com uma leitura dos itens do ToolStrip (acho que o apropriado deve ser um laço), mas se incluir o tipo SEPARATOR sempre terei um erro.

 

Compreende?

 

Veja:

Sem_t%C3%ADtulo.jpg?1372861389

 

Grato,
Gustavo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Na verdade eu tentei algo assim com o IF..

 

        For Each DropDown As ToolStripDropDownButton In PriMenuToolStrip.Items
            If TypeOf DropDown Is ToolStripDropDownButton Then
                For Each controle As ToolStripMenuItem In DropDown.DropDownItems
                    If TypeOf controle Is ToolStripMenuItem Then
                        controle.Enabled = False
                    End If
                Next
            End If
        Next

 

Me aparece o seguinte erro:

 

InvalidCastException was unhandled:

Não é possível converter um objeto do tipo 'System.Windows.Forms.ToolStripSeparator' no tipo System.Windows.Forms.ToolStripMenuItem'.

 

Dai tentei colocar outra condição no IF, assim:

        For Each DropDown As ToolStripDropDownButton In PriMenuToolStrip.Items
            If TypeOf DropDown Is ToolStripDropDownButton And Not TypeOf DropDown Is ToolStripSeparator Then
                For Each controle As ToolStripMenuItem In DropDown.DropDownItems
                    If TypeOf controle Is ToolStripMenuItem Then
                        controle.Enabled = False
                    End If
                Next
            End If
        Next

Mas ao fazer um Build, já dá o seguinte erro:

 

Error 13 Expression of type 'System.Windows.Forms.ToolStripDropDownButton' can never be of type 'System.Windows.Forms.ToolStripSeparator'.
Grato,
Gustavo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele está dizendo que seu primeiro if nunca vai ser rodado, já que o dropdownbutton nunca será do tipo separator. O primeiro if é desnecessário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Infelizmente essa mudança não resolve...

 

Alterei o código...

 

Private Sub PrincipalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For Each DropDown As ToolStripDropDownButton In PriMenuToolStrip.Items
            For Each controle As ToolStripMenuItem In DropDown.DropDownItems
                If TypeOf controle Is ToolStripMenuItem Then
                    controle.Enabled = False
                End If
            Next
        Next

End Sub

 

Mas o problema continua:

 

InvalidCastException was unhandled:

Não é possível converter um objeto do tipo 'System.Windows.Forms.ToolStripSeparator' no tipo 'System.Windows.Forms.ToolStripMenuItem'.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Compartilhar este post


Link para o post
Compartilhar em outros sites

Khaos,

Excelente!

 

Mudei para BOTAO as OBJECT e consegui a 1ª parte...

 

Solicito por gentileza mais uma ajuda... pesquisei bastante sobre MÉTODO REPERCUSSIVO e acredito que este seja o caminho, porem não estou conseguindo colocar em prática...

 

desta vez o código ficou assim:

Private Sub PrincipalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For Each menus As ToolStripDropDownButton In PriMenuToolStrip.Items

            For Each botao As Object In menus.DropDownItems

                If Not TypeOf botao Is ToolStripSeparator Then

                    botao.Enabled = False

                End If
            Next
        Next
       
End Sub

 

Porem os submenus, dentro de outros submenus (e assim vai) não estão sendo lidos...

sbr41i.jpg

 

Para isso deve ser chamado um método repercussivo, não?

 

Este tenho muitas dificuldades em fazer...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim, na verdade o toolstrip é um controle bem organizado, dentro dele haverá uma outra divisão chamada "Submenus", você deve procurar lá dentro pelos items que você deseja.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Khaos,

Bom dia!

 

Obrigado, consegui fazendo da seguinte forma:

 

    Private Sub PrincipalForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        For Each menus As ToolStripDropDownButton In PriMenuToolStrip.Items
            Dim Posicoes = Len(menus.Name.ToString())
            Dim _Nome As String = Mid(menus.Name.ToString(), Posicoes - 8, Posicoes)
            InativarSubMenus(Nothing, menus)
        Next
     End Sub



    Private Sub InativarSubMenus(botao As Object, Menus_Btn As Object)

        For Each botao In Menus_Btn.DropDownItems
            If Not TypeOf botao Is ToolStripSeparator Then
                Dim Posicoes = Len(botao.name.ToString())
                Dim _Nome As String = Mid(botao.name.ToString(), Posicoes - 8, Posicoes)

                botao.Enabled = False
                InativarSubMenus(Nothing, DirectCast(botao, Object))

            End If
        Next

    End Sub

Funcionou perfeitamente.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.