VB.NET – Aggiungere a runtime una voce di menu´ ad un menustrip ed assegnargli eventi

aggiungere_toolstripmenuitem_e_relativo_handlerNelle applicazioni capita spesso di dover aggiungere a runtime dei controlli per aggiornare la nostra interfaccia in base ad eventi esterni o interni. In questo articolo faccio l’esempio di un menustrip già esistente e posizionato nel nostro form, con varie voci principali di menù già inserite: per una di queste voci vogliamo aggiungere delle sottovoci alle quali assegnare anche la funzione da svolgere sull’evento di click (handler).

L’immagine a lato dovrebbe chiarire l’intento che si prefigge questo articolo.

Supponiamo quindi di avere sul nostro form un menustrip (chiamato ad esempio menustrip1) nel quale sono già definite delle voci, per una di queste voci, che chiameremo (proprietà (name)), ad esempio, menustrip_voce1, vogliamo aggiungere vari sottomenu in base al contenuto di un array di stringhe chiamato arrayvoci (in pratica tale array conterrà un elenco di stringhe, ognuna di queste stringhe diventerà una sottovoce di menustrip_voce1.

Vediamo la prima parte del codice che ci permette di aggiungere le sottovoci e definire un handler:

1
2
3
4
5
6
For C As Integer = 0 To arrayvoci.GetUpperBound(0)
    Dim TSMI As New ToolStripMenuItem
    TSMI.Text = arrayvoci(C)
    menustrip_voce1.DropDownItems.Add(TSMI)
    AddHandler TSMI.Click, AddressOf TSMI_Click
Next

Spiego il codice:

Riga 1 : effettuo un ciclo per ogni elemento dell’array (GetUpperBound(0) mi fornisce l’ultimo indice dell’array)
Riga 2 : istanzio un nuovo ToolStripMenuItem, che è la classe che identifica le sottovoci di menù
Riga 3 : alla nuova sottovoce assegno un testo (che sarà la stringa visualizzata all’utente), presa dall’array
Riga 4 : aggiungo la nuova sottovoce alla voce di menù facente parte del menustrip
Riga 5 : aggiungo il gestore di evento sul click del ToolStripMenuItem: quando verrà fatto click su tale sottovoce, verrà richiamata la sub identificata come TSMI_Click: da ciò si evince che la sub sarà la stessa per ogni nuova voce aggiunta, sarà nella sub che andremo a discriminare quale sottovoce è stata cliccata.

Create le nuove sottovoci di menù, passiamo a definire la sub che gestirà l’evento click:

1
2
3
4
5
Private Sub TSMI_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim mnu As ToolStripMenuItem
    mnu = DirectCast(sender, ToolStripMenuItem)
    ' qui imposteremo il codice da eseguire in base ad una particolare proprietà di mnu
End Sub

Questa sub gestirà l’evento di click su ogni nuova voce di menù aggiunta a runtime:
Riga 2 : istanzio un ToolStripMenuItem
Riga 3 : il ToolStripMenuItem viene posto uguale al ToolStripMenuItem cliccato dall’utente

La funzione DirectCast converte l’oggetto sorgente (primo argomento: variabile sender intercettata dalla sub come System.Object) nell’oggetto specificato come secondo argomento, nel nostro caso specifico, l’oggetto cliccato sarà convertito in un ToolStripMenuItem.

In questo momento la variabile mnu conterrà tutte le proprietà del ToolStripMenuItem cliccato, che possiamo sfruttare per discriminare quale voce di menù è stata premuta, possiamo utilizzare ad esempio la proprietà Text, per far eseguire istruzioni differenti in base alla voce di menù cliccata (ovviamente le proprietà Text delle varie sotto-voci inserite a runtime rispecchieranno il contenuto dell’array con il quale tali voci sono state nominate).

Questo è solo un semplice esempio di come si può agire, le metodiche in realtà sono molteplici:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Private Sub TSMI_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    Dim mnu As ToolStripMenuItem
    mnu = DirectCast(sender, ToolStripMenuItem)
 
    Select Case mnu.Text
       Case "voce 1"
          ' istruzioni da eseguire se è stata cliccata la voce con scritto voce 1
       Case "voce 2"
          ' istruzioni da eseguire se è stata cliccata la voce con scritto voce 2
       Case "voce 3"
          ' istruzioni da eseguire se è stata cliccata la voce con scritto voce 3
       Case Else
          ' istruzioni de eseguire se è stata cliccata una voce diversa dalle 3 precedenti
    End Select
End Sub
Se questo articolo ti è piaciuto, condividilo su un social:
Se l'articolo ti è piaciuto o ti è stato utile, potresti dedicare un minuto a leggere questa pagina, dove ho elencato alcune cose che potrebbero farmi contento? Grazie :)