Cerchiamo di risolvere 'sta cosa che non ne ho mai voglia e la sto tirando per le lunghe...
mGrid = New Griglia(Of Pannello)(Me, True, 30, 5, 10, 10)
For Each elemento As Pannello In mGrid
elemento.ContextMenuStrip = mioMenu
Next
Mediante la classe da me creata
Griglia ho creato una griglia di controlli di tipo
Pannello, erede di Panel.
Ad ognuno di questi attribuisco il menu contestuale
mioMenu che ho creato in fase di progettazione, vuoto.
Ovviamente, quando clicco col destro, dato che il menu contestuale è vuoto, non succede, apparentemente, assolutamente niente.
Ecco, ho fatto delle aggiunte, che marco in rosso:
mGrid = New Griglia(Of Pannello)(Me, True, 30, 5, 10, 10)
For Each elemento As Pannello In mGrid
AddHandler elemento.MouseDown, AddressOf SetMenu
elemento.ContextMenuStrip = mioMenu
Next
End Sub
Sub setMenu()
mioMenu.Items.Clear()
Dim m As New ToolStripMenuItem
m.Text = VociDelMenu(0)
mioMenu.Items.Add(m)
End Sub
Così, prima che il menu si mostri, lo posso modificare in quanto al click del mouse sull'elemento chiamo la routine
setMenu che mi aggiunge un menu con una voce, che nella fattispecie prendo da una matrice di voci del menu, e che ha come testo "aggiungi".
Adesso attribuisco al menu "aggiungi" l'esecuzione di una routine.
Per far questo, però, devo identificare e memorizzare in una variabile l'elemento da cui ho evocato il menu.
Dichiaro una variabile oggetto:
Dim elementoSelezionato As Object
E poi, nella routine
setMenu, prima di settare il menu, memorizzo l'elemento nella variabile oggetto.
Sub setMenu(sender As Object, e As MouseEventArgs)
elementoSelezionato = sender
mioMenu.Items.Clear()
Dim m As New ToolStripMenuItem
m.Text = VociDelMenu(0)
mioMenu.Items.Add(m)
End Sub
E ora studio come aggiungere un controllo nell'insieme control dell'elemento (che è una classe derivata di Panel):
Sub aggiungi()
elementoSelezionato.controls.add(New Button)
End Sub
quindi attribuisco all'evento click del menu aggiunto l'handler alla routine
aggiungi.
Sub setMenu(sender As Object, e As EventArgs)
elementoSelezionato = sender
mioMenu.Items.Clear()
Dim m As New ToolStripMenuItem
m.Text = VociDelMenu(0)
AddHandler m.Click, AddressOf aggiungi
mioMenu.Items.Add(m)
End Sub
E pare che funzioni...
Ho sostituito al Button una classe
Casella da me creata in pochi secondi (azz, che bravo!) provvisoriamente con un'ampiezza limitata in previsione di studi futuri.
Class Casella
Inherits Label
Sub New()
BackColor = Color.LightGreen
Width = 50
End Sub
End Class
E adesso dobbiamo studiarci un po' la gestione dei menu per quanto riguarda i controlli aggiunti...