Jump to content
zephirus

[Resolvido] Adicionar sub-menus em runtime

Recommended Posts

zephirus

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.

Share this post


Link to post
Share on other sites
jpaulino

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 ?

Share this post


Link to post
Share on other sites
zephirus
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.

Share this post


Link to post
Share on other sites
jpaulino

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 ...

Share this post


Link to post
Share on other sites
zephirus

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 ;)

Share this post


Link to post
Share on other sites
jpaulino

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!

Share this post


Link to post
Share on other sites
jpaulino

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

Ok, depois diz qq coisa!

Share this post


Link to post
Share on other sites
zephirus

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.

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
zephirus

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???

Share this post


Link to post
Share on other sites
zephirus

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...

Share this post


Link to post
Share on other sites
jpaulino

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.

Share this post


Link to post
Share on other sites
zephirus

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.

Share this post


Link to post
Share on other sites
zephirus

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

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
zephirus

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.

Share this post


Link to post
Share on other sites
zephirus

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.

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
zephirus

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: ?

Share this post


Link to post
Share on other sites
jpaulino

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

Share this post


Link to post
Share on other sites
zephirus

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?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.