Jump to content

Colocar items em contextmenu específico (dinamicamente)


zephirus

Recommended Posts

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?

Link to comment
Share on other 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 😄

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 😄

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other 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.

Link to comment
Share on other 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

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other 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.

Link to comment
Share on other 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 😞

Sérgio Ribeiro


"Great coders aren't born. They're compiled and released"
"Expert coders do not need a keyboard. They just throw magnets at the RAM chips"

Link to comment
Share on other 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.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • 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.