Wie füge ich in VB.NET 2003 allen MainMenu-MenuItems den Handler Men_Click hinzu und werte sie später über Select Case sender.Text aus?

Antwort vom

**Ja – aber in VB.NET 2003 musst du den Click-Handler jedem `MenuItem` einzeln oder rekursiv zuweisen, weil `MainMenu` selbst keine Klicks auslöst. Entscheidend ist: Nicht das `MainMenu`, sondern jedes enthaltene `MenuItem` braucht `AddHandler ... AddressOf men_Click`.** ## So funktioniert es Wenn du alle Menüeinträge zentral behandeln willst, gehst du die `MenuItems` durch und hängst überall denselben Handler an: ```vbnet Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load AddMenuHandler(Me.MainMenu1.MenuItems) End Sub Private Sub AddMenuHandler(ByVal items As Menu.MenuItemCollection) Dim mi As MenuItem For Each mi In items AddHandler mi.Click, AddressOf men_Click If mi.MenuItems.Count > 0 Then AddMenuHandler(mi.MenuItems) End If Next End Sub Private Sub men_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim mi As MenuItem = CType(sender, MenuItem) Select Case mi.Text Case "Öffnen" MessageBox.Show("Öffnen") Case "Speichern" MessageBox.Show("Speichern") Case "Beenden" Me.Close() End Select End Sub ``` ## Wichtiger Punkt `sender.Text` funktioniert grundsätzlich, **ist aber fehleranfällig**, weil Menütexte sich ändern können, z. B. durch: - `&Datei` statt `Datei` - Sprachumschaltung - gleiche Texte an mehreren Stellen Robuster ist in VB.NET 2003 meist dieser Weg: ```vbnet Private Sub men_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim mi As MenuItem = CType(sender, MenuItem) Select Case mi.Name Case "mnuOpen" MessageBox.Show("Öffnen") Case "mnuSave" MessageBox.Show("Speichern") Case "mnuExit" Me.Close() End Select End Sub ``` ## Der praktische Unterschied Mit `Text` steuerst du über die sichtbare Beschriftung. Mit `Name` steuerst du über die interne Kennung. **Für echten Programmcode ist `Name` klar besser, weil die Logik dann nicht kaputtgeht, nur weil sich der Menütext ändert.**

Kategorie: Technik Tags: VBNET MainMenu MenuItems

Verwandte Fragen

Wie erhalte ich in VB.NET 2003 eine Auflistung der oberen Ebene von MainMenu1?

In VB.NET 2003 bekommst du die Einträge der obersten Ebene eines MainMenu über dessen MenuItems-Auflistung. Für MainMenu1 sind also genau diese Elemente die Menüpunkte der oberen E...

Wie heißen die einzelnen Menügruppen im MainMenu von VB.NET 2003?

Ja: Diese Einträge heißen in VB.NET 2003 beim MainMenu in der Praxis meist Top-Level-Menüpunkte oder Hauptmenüs; technisch sind es MenuItem-Objekte. Wenn du also „Datei&ldq...