Μια εύκολη και γρήγορη λύση είναι το παρακάτω:
Private Sub ΔημιουργίαCmΠρογράμματα()
For Each ts As ToolStripButton In Mn.Items
TοποθέτησηItemsCm(ContextMenuStrip1, ts.Text, ts)
Next
End Sub
Private Sub TοποθέτησηItemsCm(ByVal Cm As System.Windows.Forms.ContextMenuStrip, ByVal onom As String, ByVal ts As ToolStripButton)
Dim b1 As New System.Windows.Forms.ToolStripMenuItem
AddHandler b1.Click, AddressOf ToolStripMenuItem_Click
b1.Text = onom
b1.Tag = ts
Cm.Items.Add(b1)
End Sub
Private Sub ToolStripMenuItem_Click(ByVal sender As Object, ByVal e As System.EventArgs)
CType(CType(sender, ToolStripMenuItem).Tag, ToolStripButton).PerformClick()
End Sub
Ουσιαστικά, όταν δημιουργείς κάθε ToolStripMenuItem περνάς στο Tag property το αντίστοιχο ToolStripButton. Κατόπιν βάζεις όλα τα ToolStripMenuItems να βλέπουν στον ίδιο event handler κι εκεί αφού κάνεις τις απαραίτητες μετατροπές, από sender σε ToolStripMenuItem και από το Tag του σε ToolStripButton, βάζεις τελικά το αρχικό ToolStripButton να κάνει ένα virtual click.
Ως λύση, είναι απλή και ξεμπερδεύεις γρήγορα. Ωστόσο έχει το μειονέκτημα ότι δεν μπορεί να επεκταθεί σε άλλα είδη από events καθώς δεν υπάρχουν τα αντίστοιχα PerformXXX. Εναλλακτικά, γίνεται με κάνεις ακριβώς αυτό που λές, να πάρεις τον event handler από το control ωστόσο θα χρειαστεί να παίξεις με reflection και δεν είναι και τόσο εύκολο.
Τέλος, τέτοια σενάρια είναι κατάλληλα για να αρχίσεις να σκέφτεσαι για το Command Pattern
http://en.wikipedia.org/wiki/Command_pattern
http://www.dofactory.com/Patterns/PatternCommand.aspx
http://www.vbdotnetheaven.com/UploadFile/rajeshvs/CommandPattern05252005073710AM/CommandPattern.aspx
Αν σε ενδιαφέρει και θες βοήθεια στην υλοποίηση σε VB.NET, θα την βγάλουμε την άκρη...
Vir prudens non contra ventum mingit