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

zephirus

Colocar items em contextmenu específico (dinamicamente)

13 mensagens neste tópico

Olá,

Quero colocar todos os items da primeira coluna de uma listview em 5 subitems de um contextmenu. A separação dos items é feita de acordo com o valor da uma coluna. Exemplo:

ListView:

colA    colB

aaa      val1

bbb      val1

ccc      val4

ddd      val3

eee      val1

fff      val2

ggg      val7

O meu contextmenu terá os items da colB (sem repetição). Neste caso seria:

val1

val2

val3

val4

val7

O que eu quero é, ao percorrer toda a listview, que ele coloque os valores da colA nos respectivos subitems do contextmenu, assim:

val1 - aaa, bbb, eee

val2 - fff

val3 - ddd

val4 - ccc

val7 - ggg

Há alguma maneira de colocar os valores num determinado subitem do contextmenu?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já estive a ver e continuo sem perceber como é que sei em que subitem é que vou colocar a primeira coluna. É que eu tenho de ir lá pelo nome, do género, criar um subitem onde item do contextmenu é igual a"val1".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens os nomes e são tudo colecções. É uma questão de brincar com ciclos. :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens os nomes e são tudo colecções. É uma questão de brincar com ciclos. :(

ribeiro, desculpa insistir mas se eu soubesse como fazer isso não perguntava. Eu sei que este código está errado mas a minha ideia era esta:

If MainForm.contextMenuStripList.Contains("nome do item") Then exits= TRUE

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E estás a pensar bem. Como disse, são tudo colecções.

Escrevi-te um pequeno bloco de código que passa por TODOS os items em TODOS os níveis, não interessa quantos tenhas.

Daqui já deves tirar conclusões.

Quanto ao insistir, se não percebeste só tens é de insistir :(

Quem te ajuda logo decide se te dá o peixe ou a cana.

Toma lá a cana e o isco :D

Public Class Form1

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

        For Each TSI As ToolStripMenuItem In ContextMenuStrip1.Items
            MsgBox(TSI.Text)
            DigMenu(TSI)
        Next

    End Sub


    Private Sub DigMenu(ByVal MenuItem As ToolStripMenuItem)

        For Each SubTSI As ToolStripMenuItem In MenuItem.DropDownItems
            MsgBox(SubTSI.Text)
            If SubTSI.DropDownItems.Count > 0 Then
                DigMenu(SubTSI)
            End If
        Next

    End Sub
End Class

A colecção DropDownItems suporta o método Contains :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já consegui fazer o que pretendia, no entanto surgiu outra dúvida. O meu código é este:

Function CreateContextList(sortColumn As Integer)
MainForm.contextMenuStripList.Items.Clear
Dim done As Boolean = False

''
Dim subItem0 As New ToolStripMenuItem("Custom...")
AddHandler subItem0.Click, AddressOf MainForm.customMachine_Click
MainForm.contextMenuStripList.Items.Add(subItem0)
MainForm.contextMenuStripList.Items.Add(SEPARATOR)
'' 

For i As Integer = 0 To MainForm.listview1.Items.Count - 1
	For Each SubTSI As ToolStripMenuItem In MainForm.contextMenuStripList.Items
		If SubTSI.Text = MainForm.listview1.Items.Item(i).SubItems.Item(sortColumn).Text Then
			Dim contextItem2 As New ToolStripMenuItem(MainForm.listview1.Items.Item(i).Text)
			Dim subContextItem1 As New ToolStripMenuItem
			subContextItem1.Text = "Connect..."
			Dim subContextItem2 As New ToolStripMenuItem
			subContextItem2.Text = "Open Shared Folders"
			contextItem2.DropDownItems.Add(subContextItem1)
			contextItem2.DropDownItems.Add(subContextItem2)
			SubTSI.DropDownItems.Add(contextItem2)
			done = True
			Exit For
		Else
			done = False
		End If
	Next
	If done = False Then
			Dim sortItem As New ToolStripMenuItem(MainForm.listview1.Items.Item(i).SubItems.Item(sortColumn).Text)
			Dim contextItem2 As New ToolStripMenuItem(MainForm.listview1.Items.Item(i).Text)
			Dim subContextItem1 As New ToolStripMenuItem
			subContextItem1.Text = "Connect..."
			Dim subContextItem2 As New ToolStripMenuItem
			subContextItem2.Text = "Open Shared Folders"
			contextItem2.DropDownItems.Add(subContextItem1)
			contextItem2.DropDownItems.Add(subContextItem2)
			sortItem.DropDownItems.Add(contextItem2)				
			MainForm.contextMenuStripList.Items.Add(sortItem)
	End If
Next

Dim subItem1 As New ToolStripMenuItem("Main Window")
AddHandler subItem1.Click, AddressOf MainForm.menuMain_Click
Dim subItem2 As New ToolStripMenuItem("About")
AddHandler subItem2.Click, AddressOf MainForm.menuAbout_Click
Dim subItem3 As New ToolStripMenuItem("Exit")
AddHandler subItem3.Click, AddressOf MainForm.menuExit_Click
MainForm.contextMenuStripList.Items.Add(SEPARATOR)
MainForm.contextMenuStripList.Items.Add(subItem1)
MainForm.contextMenuStripList.Items.Add(subItem2)
MainForm.contextMenuStripList.Items.Add(subItem3)
End Function

No início da função eu adiciono ao meu contextmenu, 2 items: "Custom..." e um separador. É possível depois na parte em que percorro todos os items do contextmenu, em vez do "For each...", obrigar a que percorra todos os items excepto esses 2 primeiros? É que o separador não é identificado como item e apesar de eu poder fazer uma rotina para evitar o erro, se calhar existe um modo mais simples.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes dar nomes chave aos items de menu.

Por exemplo, todos os que sejam para ignorar, atribuís nomes como: IGNORA_Item1, IGNORA_Item2.

Ao percorreres os items, acrescentas a lógica que vai verificar se o nome começa por "IGNORA". Caso comece... ignora-se.

Atenção: Quando digo nomes chave refiro-me mesmo aos NOMES chave, e não ao Text apresentado. O nome não está disponível no user-end

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Podes dar nomes chave aos items de menu.

Por exemplo, todos os que sejam para ignorar, atribuís nomes como: IGNORA_Item1, IGNORA_Item2.

Ao percorreres os items, acrescentas a lógica que vai verificar se o nome começa por "IGNORA". Caso comece... ignora-se.

Atenção: Quando digo nomes chave refiro-me mesmo aos NOMES chave, e não ao Text apresentado. O nome não está disponível no user-end

Ok, obrigado. Eu assim sei fazer. Podia ser que houvesse outra maneira.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há mais maneiras.

Por exemplo, se tiveres a certeza de que os índices desses items vão ser sempre 0 e 1, podes usar um For xxx=2 To xxx.

Há mil e uma maneiras, mas nem sempre a mais complicada ou floreada é e melhor :(

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há mais maneiras.

Por exemplo, se tiveres a certeza de que os índices desses items vão ser sempre 0 e 1, podes usar um For xxx=2 To xxx.

Há mil e uma maneiras, mas nem sempre a mais complicada ou floreada é e melhor :(

Sei sempre que são os 2 primeiros. Em vez do For Each faço um For x = 2 To context.items.count - 1.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a ver? Já tens duas soluções :(

Bom, acabei por optar por colocar esses 2 primeiros items no final. Assim fica tudo mais simples e para o que quero, até esteticamente fica melhor. Obrigado pela paciência.

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