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

Kann man in VB.NET 2003 mit "Lines" arbeiten, ohne den String vorher in eine TextBox zu laden?

Ja. Lines ist nur eine bequeme Eigenschaft der TextBox; wenn du keinen Text in eine TextBox laden willst, zerlegst du den String direkt selbst in ein String-Array und arbeitest damit weiter. Der prakt...