• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zephirus

[Resolvido] Adicionar sub-menus em runtime

30 mensagens neste tópico

Olá,

Tenho um menu de nome "xpto". Quero, ao carregar num botão, adicionar um submenu de nome "xpto2" com text = "xpto3". Como faço isto?

Obrigado

EDIT: entretanto já consegui.

Dim menu As New MenuStrip()

	Dim item As New ToolStripMenuItem("xpto")
	For i As Integer = 0 To comboBox1.Items.Count - 1
		Dim xpto2 As New ToolStripMenuItem("xpto3")
		item.DropDownItems.Add(xpto2)
	Next
	menu.Items.Add(item)

Me.Controls.Add(menu)

Agora tenho outro problema. A minha combobox tem 3 items, vamos supor. Assim sendo, vão ser criados 3 sub-menus. A minha questão é qual os nomes de cada um desses sub-menus e como é que eu posso programar algo quando se clica neles??? De notar que o número de items na combobox pode variar e eu nunca sei de antemão.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

zephirus ,

Quando quiseres colocar novas questões colocas a mensagem como resolvida e crias um novo tópico, ok ?

Assim é mais fácil organizar o fórum.

Agora tenho outro problema. A minha combobox tem 3 items, vamos supor. Assim sendo, vão ser criados 3 sub-menus. A minha questão é qual os nomes de cada um desses sub-menus e como é que eu posso programar algo quando se clica neles??? De notar que o número de items na combobox pode variar e eu nunca sei de antemão.

Relativamente a esta questão queres saber qual o item que seleccionaste, é isso ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Relativamente a esta questão queres saber qual o item que seleccionaste, é isso ?

Eu tenho o mesmo número de itens na minha combobox e no menu. Já programei o que quero quando clico em determinado item da combobox, por exemplo quando clico no 2º item, vamos supor. Basicamente, quando clicar no 2º sub-menu que foi criado quero que faça o mesmo. Só que eu não sei os nomes desses sub-menus.

Peço desculpa se estou a ser confuso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu tenho o mesmo número de itens na minha combobox e no menu. Já programei o que quero quando clico em determinado item da combobox, por exemplo quando clico no 2º item, vamos supor. Basicamente, quando clicar no 2º sub-menu que foi criado quero que faça o mesmo. Só que eu não sei os nomes desses sub-menus.

Peço desculpa se estou a ser confuso.

De momento não posso, mas logo à tarde mostro-te um exemplo e depois vês se é isso que queres.

Aguarda um pouco ...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

De momento não posso, mas logo à tarde mostro-te um exemplo e depois vês se é isso que queres.

Aguarda um pouco ...

Ok obrigado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como prometido ...

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ' Adicionar alsuns itens à combobox
        Me.ComboBox1.Items.AddRange(New Object() {"a", "b", "c", "d", "e"})

        ' Adiciona os itens da combo ao MenuItem
        Dim item As New ToolStripMenuItem("abc")

        For i As Integer = 0 To Me.ComboBox1.Items.Count - 1

            ' Cria um novo subitem e define o texto
            Dim subitem As New ToolStripMenuItem
            subitem.Text = Me.ComboBox1.Items.Item(i).ToString

            ' Define que no evento Click irá executar a subrotina "item_Click"
            AddHandler subitem.Click, AddressOf item_Click

            item.DropDownItems.Add(subitem)
        Next
        
        ' Adiciona o item ao MenuStrip
        Me.MenuStrip1.Items.Add(item)

    End Sub


    ' Quando um menu é seleccionado
    Private Sub item_Click(ByVal sender As Object, ByVal e As System.EventArgs)
        Dim myItem As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        Debug.WriteLine(myItem.Text)
    End Sub

Se tiveres dúvidas diz!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado jpaulino. Ainda não tive tempo para ver se é isso que quero mas quando puder digo :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado jpaulino. Ainda não tive tempo para ver se é isso que quero mas quando puder digo :)

Ok, depois diz qq coisa!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ok, depois diz qq coisa!

Olá jpaulino. Já experimentei o teu código e consigo criar os sub-menus iguais aos elementos que tenho na combobox. A questão agora é que eu tenho o seguinte código para o click nos items da combobox:

Sub ComboBox1SelectedIndexChanged(sender As Object, e As EventArgs) Handles Panel1.Click, Panel2.Click, _
	Panel3.Click, Panel4.Click, Panel5.Click, Panel6.Click, Panel7.Click, _
	rotating_Label52.Click,	rotating_Label53.Click, rotating_Label54.Click, rotating_Label55.Click, _
	rotating_Label56.Click, rotating_Label57.Click, rotating_Label58.Click, rotating_Label59.Click, _
               .............

Dim choosed As String = combobox1.items(combobox1.SelectedIndex).Substring(0,4)

End Sub

Quando clico num item da combobox ele faz esse código dessa sub acima (ir buscar os primeiros 4 caracteres do item seleccionado). Mediante esse resultado faz uma certa coisa. O que eu quero é que ao seleccionar nos menus, faça exactamente o mesmo. Basicamente eu tenho x itens na combobox e os mesmos x itens no menu e para indices iguais, o codigo é o mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nova questão, novo tópico :) ... para a próxima ok ? É só porque outros também podem ajudar se criares uma nova questão.

Mas agora continuando ... não adicionaste um handler aos items ?

AddHandler subitem.Click, AddressOf item_Click

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nova questão, novo tópico :) ... para a próxima ok ? É só porque outros também podem ajudar se criares uma nova questão.

Mas agora continuando ... não adicionaste um handler aos items ?

AddHandler subitem.Click, AddressOf item_Click

Mas a questão é a mesma do início. De qualquer forma, acho que percebeste o que eu quero mas isso dos handlers fazem-me muita confusão. Onde é que tenho de fazer isso???

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra lá o código que tens ...

Tenho uma form com uma combobox e um botão.

Código:

Sub Button1Click(sender As Object, e As EventArgs)

	For i As Integer = 0 To 9
		comboBox1.Items.Add(i)
	Next

End Sub

Sub ComboBox1SelectedIndexChanged(sender As Object, e As EventArgs)
	Me.Text = comboBox1.Items(comboBox1.SelectedIndex)
End Sub

Como disse antes quero que ao carregar no botão, além de adicionar os 10 itens à combobox, que tb me crie 10 submenus. Isto já consegui fazer com o código que me deste. O que pretendo agora é que ao clicar nesses submenus o código seja o mesmo do que qd clico no combobox. E é isto que eu n sei fazer...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O que pretendo agora é que ao clicar nesses submenus o código seja o mesmo do que qd clico no combobox. E é isto que eu n sei fazer...

E é isto que não entendo!

Ou seja, carregas no botão e adicionas items à combobox e aos submenus. E depois? Dá um exemplo, explica melhor porque não consigo perceber o que queres.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E é isto que não entendo!

Ou seja, carregas no botão e adicionas items à combobox e aos submenus. E depois? Dá um exemplo, explica melhor porque não consigo perceber o que queres.

Já tenho a combobox com 10 itens (index 0 a 9). Também já tenho os 10 sub-menus (cujos indexs não sei como funcionam) mas quero que ao clicar no 1º submenu criado faça o mesmo do que quando clico no primeiro item da combobox e que qd clicar no submenu nº3 faça o mesmo que qd clico no item nº3 da combobox.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sub Button1Click(sender As Object, e As EventArgs)

   For i As Integer = 0 To 9
      comboBox1.Items.Add(i)
   Next

' Adiciona os itens da combo ao MenuItem
Dim item As New ToolStripMenuItem("abc")

For i As Integer = 0 To Me.ComboBox1.Items.Count - 1

   ' Cria um novo subitem e define o texto
   Dim subitem As New ToolStripMenuItem
   subitem.Text = Me.ComboBox1.Items.Item(i).ToString

   ' Define que no evento Click irá executar a subrotina "item_Click"
   AddHandler subitem.Click, AddressOf item_Click

   item.DropDownItems.Add(subitem)

Next

End Sub

Sub ComboBox1SelectedIndexChanged(sender As Object, e As EventArgs)
   Me.Text = comboBox1.Items(comboBox1.SelectedIndex)
End Sub

Com esse código fico com uma combobox com 10 items e um menu com 10 sub-menus. Quando clico num item da combobox o text da form muda. Eu quero que faça o mesmo quando clico nos sub-menus criados  :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então depois de atribuires o handler ao item_Click podes fazer isto:

    Sub item_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        Me.Text = item.Text
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então depois de atribuires o handler ao item_Click podes fazer isto:

    Sub item_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        Me.Text = item.Text
    End Sub

Olá jpaulino, eu percebo a tua ideia. Mas neste caso tu "repetes" o código. Imagina que em vez de "Me.Text...." eu quero por um código de mil linhas. O que eu pretendia era reutilizar o código que já tinha para o click da combobox visto que na realidade tenho o mesmo número de itens tanto na combobox como de sub-menus.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas tu não repetes nada! Isto dá para todos os subitems.

Explica lá melhor.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas tu não repetes nada! Isto dá para todos os subitems.

Explica lá melhor.

Tu assim vais ter duas linhas de código "repetidas":

Me.Text = comboBox1.Items(comboBox1.SelectedIndex)

e

Me.Text = item.Text (eu aqui não quero que mostre o texto, quero que mostre o index do sub-menu.

Eu penso que há uma maneira de não ter de repetir o código todo visto que podia usar os indexs. Basicamente, quando clico no submenu 0, quero que faça exactamente o mesmo como se tivesse carregado no item 0 da combobox.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas para esclarecer …. tu queres alterar o título do form quando alteras a combobox ou no menu, certo ? Se for assim podes fazer duas coisas.

1 - Repetir código, ou seja, colocar o código na combobox e como te mostrei

2 - Quando seleccionar no menu, altera o índex da combobox, que por sua vez vai alterar o texto

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas para esclarecer …. tu queres alterar o título do form quando alteras a combobox ou no menu, certo ? Se for assim podes fazer duas coisas.

1 - Repetir código, ou seja, colocar o código na combobox e como te mostrei

2 - Quando seleccionar no menu, altera o índex da combobox, que por sua vez vai alterar o texto

Sim é isso que pretendo e não quero repetir código. Se der para fazer como no ponto 2, óptimo. Como é que faço com que ao seleccionar o menu, seja como se carregasse na combobox :confused:?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então e assim:

    Sub item_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim ts As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        Me.ComboBox1.Text = ts.Text
    End Sub

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Então e assim:

    Sub item_Click(ByVal sender As Object, ByVal e As EventArgs)
        Dim ts As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        Me.ComboBox1.Text = ts.Text
    End Sub

Óptimo jpaulino!!! Só tenho uma última questão que não consegui resolver. Eu consigo neste último código saber qual o index do submenu que carrego?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora