Ciclo su menuStrip C#

mercoledì 20 novembre 2013 - 19.11
Tag Elenco Tags  C#

pelling10 Profilo | Junior Member

Salve! avrei bisogno di un vostro autorevole aiuto...
Ho bisogno di fare un ciclo sul menuStrip che contiene 1 menu 'padre' e 2 menu 'figli'
per conoscere i relativi nomi dei menu 'padri' e dei menu 'figli';
il codice che ho scritto è il seguente:

for (int i = 0; i < menuStrip1.Items.Count; i++)
{
MessageBox.Show(menuStrip1.Items[i].Name.ToString());
MessageBox.Show(menuStrip1.Items[i].Text.ToString());

ToolStripMenuItem a = new ToolStripMenuItem(menuStrip1.Items[i].Name);

for (int x = 0; x < a.DropDownItems.Count; x++)
{
MessageBox.Show(a.DropDownItems.Count.ToString());
MessageBox.Show(a.DropDownItems[x].Name.ToString());
}

}
Il primo ciclo mi restituisce i nomi dei menu 'padri'
Il secondo ciclo dovrebbe restituirmi i relativi nomi menu 'figli' dei singoli menu 'padri'.... invece la count è sempre zero!

dove sbaglio?
Grazie!

AntCiar Profilo | Expert

Ciao.
Il problema sta nel fatto che tu fai una inizializzazione di un nuovo MenuItem dandogli solo in Nome del padre ma all'interno questo è vuoto

ToolStripMenuItem a = new ToolStripMenuItem(menuStrip1.Items[i].Name);

Per fare quello che chiedi usa questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra




Cristian Barca

Davide1986 Profilo | Junior Member

Un'altra alternativa può essere questa : (E' da renderla ricorsiva per essere una funzione completa, attualmente la funzione va a profondità 3 Padre->Figlio->Nipote)

Spero di esserti stato d'aiuto.. Se ho tempo ti posto la funzione Ricorsiva ..

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it

pelling10 Profilo | Junior Member

Grazie mille per il grande aiuto!

pelling10 Profilo | Junior Member

Ciao, scusa il disturbo mi daresti un aiuto?

Ho un form con un menuStrip, lo stesso è composto da un certo numero di ToolStripMenuItem.
I nomi dei ToolStripMenuItem sono scritti in una tabella.
Vorrei leggere la tabella ed assegnare al singolo ToolStripMenuItem una proprietà, esempio:

string menu = "Voce1";
ToolStripMenuItem m = (ToolStripMenuItem)menuStrip1.Items[menu];
m.Visible = false;

String menu dovrebbe essere la mia stringa letta dalla tabella, dovrei poi convertire il tipo stringa in un ToolStripMenuItem agganciato al mio menuStrip1
Il problema è che alla fine la mia variabile m di tipo ToolStripMenuItem è sempre vuota.....
dove sbaglio???
GRAZIE per qualsiasi aiuto!!!!

Davide1986 Profilo | Junior Member

Non sapendo come hai creato la Tabella, io ho ipotizzato due liste contenenti i nomi dei Padri (come : Menu, Help, ecc..) e i nome dei figli (come : Crea File, Trova File, Esci, ecc..) , cosi sono facili da riempire utilizzando il metodo .add() di una lista.

Brevemente la spiegazione :

Realizzare in maniera dinamica a tempo di esecuzione dell'applicazione/form il caricamento del menu :

Cosa Otteniamo con il nostro codice:

Menu --->Crea File --->Trova File --->Esci Help

Devi aggiungere nella lista elencoPadriMenu tutte le voci del menu, esempio se vogliamo aggiungere "Inserisci" basta che inserisci elencoPadriMenu.Add(new Nodo("&Inserisci",true));

Cosi ottengo :

Menu --->Crea File --->Trova File --->Esci Help Inserisci

Se ora vogliamo inserire un sotto menu al Menu Padre "Inserisci" basta modificare il codice in questa maniera :

elencoPadriMenu.Add(new Nodo("&Inserisci","Sotto Menu",true));

Cosi Ottengo :

Menu --->Crea File --->Trova File --->Esci Help Inserisci --->Sotto Menu

Se invece vuoi inserire un elenco di sotto menu ad un specifico elemento ("Inserisci") devi creare una Lista di tipo stringa esempio :

List<String> elencoFigliMenu = new List<string>(); //Creio i figli elencoFigliMenu.Add("&Sotto Menu 1"); elencoFigliMenu.Add("&Sotto Menu 2"); elencoFigliMenu.Add("&Sotto Menu 3"); //Collego il Padre al Figli elencoPadriMenu.Add(new Nodo("&Inserisci",elencoFigliMenu,true));

Menu --->Crea File --->Trova File --->Esci Help Inserisci --->Sotto Menu 1 --->Sotto Menu 2 --->Sotto Menu 3

Ecco un esempio di codice :

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Creare la classe Nodo.cs

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace PersonalizzaMenuTable { public class Nodo { private string keyNodoPadre; private List<String> nodiFigli; private Boolean visibilitaNodo; public Nodo() { this.keyNodoPadre = null; this.nodiFigli = new List<string>(); this.visibilitaNodo = true; } public Nodo(string keyNodoPadre, List<String> nodiFigli, Boolean visibilitaNodo) { this.keyNodoPadre = keyNodoPadre; this.nodiFigli = nodiFigli; this.visibilitaNodo = visibilitaNodo; } public Nodo(string keyNodoPadre, Boolean visibilitaNodo) { this.keyNodoPadre = keyNodoPadre; if (this.nodiFigli == null) this.nodiFigli = new List<string>(); this.visibilitaNodo = visibilitaNodo; } public Nodo(string keyNodoPadre, String nodoFiglo, Boolean visibilitaNodo) { this.keyNodoPadre = keyNodoPadre; if (this.nodiFigli == null) this.nodiFigli = new List<string>(); this.nodiFigli.Add(nodoFiglo); this.visibilitaNodo = visibilitaNodo; } public string getKeyNodoPadre() { return this.keyNodoPadre; } public void setKeyNodoPadre(string newKeyNodoPadre) { this.keyNodoPadre = newKeyNodoPadre; } public List<String> getNodiFigli() { return this.nodiFigli.ToList(); } public void setNodiFigli(List<String> newNodiFigli) { this.nodiFigli = newNodiFigli; } public Boolean getVisibilitaNodo() { return this.visibilitaNodo; } public void setVisibilitaNodo(Boolean newVisibilitaNodo) { this.visibilitaNodo = newVisibilitaNodo; } public Boolean addNodoFiglio(String nodoFiglio) { if (this.nodiFigli == null) this.nodiFigli = new List<String>(); if (this.nodiFigli.Contains(nodoFiglio) == false) this.nodiFigli.Add(nodoFiglio); return true; } public Boolean cercaFiglio(String nomeFiglio) { if (this.nodiFigli == null) this.nodiFigli = new List<string>(); return ( this.nodiFigli.Contains(nomeFiglio)); } } }

Ricorda che, accettare la risposta è un modo di ringraziare chi ci ha aiutato ed evidenziare che il problema è stato risolto.
Blog ImaginSystems
http://blogs.dotnethell.it/imaginsystems
http://www.alpacasrl.it
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5