MDI e Menù dinamici

mercoledì 12 aprile 2006 - 09.48

Kalem Profilo | Newbie

Buongiorno a tutti,
vorrei chiedervi una cosa...
Sto creando un'applicazione MDI con i suoi bei menù.
Ad un MenuItem, figlio del menù principale, ho aggiunto una sottolista di menù caricata dinamicamente, ma sto impazzendo con i metodi e attributi dei MenuItem.
Come faccio a capire quale elemento della lista dinamica è stato clickato??? Chi e che evento genera??? Lo genera un evento???

sanbiz Profilo | Senior Member

>Buongiorno a tutti,
>vorrei chiedervi una cosa...
>Sto creando un'applicazione MDI con i suoi bei menù.
>Ad un MenuItem, figlio del menù principale, ho aggiunto una sottolista
>di menù caricata dinamicamente, ma sto impazzendo con i metodi
>e attributi dei MenuItem.
>Come faccio a capire quale elemento della lista dinamica è stato
>clickato??? Chi e che evento genera??? Lo genera un evento???

Puoi appoggiarti all'evento _ItemClicked del tuo menuItem

private sub menuItem_ItemClicked (ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles menuItem.ItemClicked

dove sender sarà il nuovo oggetto (menu) che hai aggiunto dinameicamente.
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

Kalem Profilo | Newbie

Ciao...
ti ringrazio per la risposta, ma... quell'evento non ce l'ho!!!

E poi ho anche un'altro problemino... tutte le finestre figlie (e i controlli all'interno) che apro nel mio form contenitore mi vengono visualizzate con le dimensioni raddoppiate, perchè??? Come faccio a metterle delle dimensioni che voglio io???

sanbiz Profilo | Senior Member

>Ciao...
>ti ringrazio per la risposta, ma... quell'evento non ce l'ho!!!
>
Cominciamo col capire che versione stai usando, la 2003 o la 2005?

>E poi ho anche un'altro problemino... tutte le finestre figlie
>(e i controlli all'interno) che apro nel mio form contenitore
>mi vengono visualizzate con le dimensioni raddoppiate, perchè???
>Come faccio a metterle delle dimensioni che voglio io???
Beh, penso che da qualche parte tu gli dica che vuoi applicare una scala doppia.
Non è che stai usando vb 2003?
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

Kalem Profilo | Newbie

Già, ho il VS 2003... è un problema???

sanbiz Profilo | Senior Member

>Già, ho il VS 2003... è un problema???
No, nessun problema, è solo che vb.net 2003 è abbastanza differente dalla versione 2005, almeno per quel che riguarda alcuni controlli ed i loro eventi.

Dunque. Per quanto riguarda le dimensioni doppie, prova a debuggare il programma e guarda se viene impostata una proprietà "Size" o "Scale" mi sembra...

Per quanto riguarda le proprietà non ricordo più il 2003, ma dovrebbe esserci un qualche cosa che fà riferimento al click di un menuitem.
Potresti associare un evento tu runtime in fase di creazione dell'oggetto con il comando "AddHandler nomeItem.Click, AddressOf nomeItem_Click"
--
Sandro Bizioli
http://blogs.dotnethell.it/sandro/

Kalem Profilo | Newbie

Per le dimensioni della finestra avevo già risolto, era la proprietà AutoScale che impostata a True mi raddoppiava il tutto...
Per associare l'evento runtime ora ci proverò, grazie!!!

Kalem Profilo | Newbie

Ok, ho provato come dicevi a fare la creazione dell'handler runtime. ma non mi accetta il nomeItem_Click

Cteniza Profilo | Guru

Fatti una classe che eredita da menuitem (esempio MyMenu) in cui ci metti il "nome" tra le varie proprietà esportate.

Poi da codice assegni questo al menu.
Per impostare il click non devi far altro che inserire il gestore dell'evento:
Private Sub MyMenu_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim mnu As MyMenu = CType(sender,MyMenu)
if mnu.Name = "xxx" Then ...

End Sub
ed aggiungere l'evento al menuitem:
AddHandler myMenuItem.Click, AddressOf MyMenu_Click

Kalem Profilo | Newbie

Non avevo ancora letto il tuo post, grazie per la risposta, intanto avevo scritto il seguente codice che funziona, ma c'è un problema!!!

globale
Dim WithEvents nomeItem As MenuItem

sulla creazione delle voci
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
ed infine il gestore evento
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
il problema ora è che rimane instanziato all'ultima voce creata... devo riuscire a individuare l'indice o il nome della voce clickata...

Cteniza Profilo | Guru

Puoi usare il tag per indicare "io sono quel menu"

Kalem Profilo | Newbie

ovvero??? come lo uso il tag... quale tag... non afferro

Cteniza Profilo | Guru

Su ogni oggetto menuitem (come del resto su moltissimi altri controlli) esiste una proprietà di tipo object "tag" in cui ci puoi memorizzare "a piacere" quello che ti serve.
A me è capitato di memorizzarci riferimenti a forms diverse, riferimenti ad altri oggetti, semplici stringhe.
Dur durante l'impostazione dinamica (in run time) dei menuitem puoi mettere: "Apri" sulla proprietà "Tag"
Estrarre il dato poi è molto semplice, dall'evento click fai:
Dim myDato As String = String.Empty
Dim myMenuItem As MenuItem = CType(sender,MenuItem)
If Not myMenuItem.Tag Is Nothing Then
myDato = CType(myMenuItem.Tag,String)
End If

Kalem Profilo | Newbie

Ma ioi non ho la proprietà Tag, io sto usando il componente System.Windows.Forms.MenuItem di VB.NET 2003

Cteniza Profilo | Guru

Guarda che ti sbagli.
Credo inoltre che tu per prima cosa "prima di postare domande e/o risposte a domande" è meglio che tu faccia una analisi approfondita della classe menuitem dall'help e che ti faccia "un giro" sugli esempi di codice presenti nel framework.
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5