zephirus Posted October 9, 2009 at 12:29 AM Report Share #290840 Posted October 9, 2009 at 12:29 AM 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 More sharing options...
ribeiro55 Posted October 9, 2009 at 02:03 AM Report Share #290847 Posted October 9, 2009 at 02:03 AM Podes tentar tirar algumas conclusões daqui. 😉 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 More sharing options...
zephirus Posted October 9, 2009 at 09:58 AM Author Report Share #290863 Posted October 9, 2009 at 09:58 AM Podes tentar tirar algumas conclusões daqui. 😉 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". Link to comment Share on other sites More sharing options...
ribeiro55 Posted October 9, 2009 at 10:27 AM Report Share #290864 Posted October 9, 2009 at 10:27 AM Tens os nomes e são tudo colecções. É uma questão de brincar com ciclos. 😞 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 More sharing options...
zephirus Posted October 9, 2009 at 10:57 AM Author Report Share #290867 Posted October 9, 2009 at 10:57 AM 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 Link to comment Share on other sites More sharing options...
ribeiro55 Posted October 9, 2009 at 11:13 AM Report Share #290868 Posted October 9, 2009 at 11:13 AM 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 More sharing options...
zephirus Posted October 9, 2009 at 05:21 PM Author Report Share #290912 Posted October 9, 2009 at 05:21 PM 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 More sharing options...
ribeiro55 Posted October 9, 2009 at 05:57 PM Report Share #290921 Posted October 9, 2009 at 05:57 PM 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 More sharing options...
zephirus Posted October 9, 2009 at 06:03 PM Author Report Share #290922 Posted October 9, 2009 at 06:03 PM 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 More sharing options...
ribeiro55 Posted October 9, 2009 at 06:10 PM Report Share #290925 Posted October 9, 2009 at 06:10 PM 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 More sharing options...
zephirus Posted October 9, 2009 at 06:15 PM Author Report Share #290927 Posted October 9, 2009 at 06:15 PM 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 More sharing options...
ribeiro55 Posted October 9, 2009 at 06:17 PM Report Share #290929 Posted October 9, 2009 at 06:17 PM Estás a ver? Já tens duas soluções 😞 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 More sharing options...
zephirus Posted October 9, 2009 at 06:22 PM Author Report Share #290930 Posted October 9, 2009 at 06:22 PM 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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now