Veröffentlicht: 11. Aug 2003 | Aktualisiert: 28. Jun 2004
Von Frank C. Rice
Auf dieser Seite
Einführung
Erstellen eines Menüs zur Entwurfszeit
Verknüpfen der Ereignisse
Erstellen eines alternativen Menüs
Hinzufügen von weiteren Menüfunktionen
Testen der Anwendung
Programmtechnisches Erstellen eines Menüs
Programmtechnisches Erstellen von alternativen Menüs
Schlussfolgerung
Einführung
Mit Microsoft .NET erstellte Anwendungen können für verschiedene Kontexte (oder verschiedene Anwendungsstatusarten) unterschiedliche Menüs anzeigen. Die entsprechenden Menüstrukturen werden unter Verwendung des MainMenu-Steuerelements in Microsoft .NET-Formularen erstellt. Das MainMenu-Steuerelement stellt dabei den Container für die Menüstruktur eines Formulars dar. Ein Menü besteht aus MenuItem-Objekten, die die einzelnen Menübefehle in der Menüstruktur bilden. Jedes MenuItem-Objekt kann ein Befehl für Ihre Anwendung oder ein übergeordnetes Menü für Elemente anderer Untermenüs sein. Um das MainMenu-Steuerelement an das Formular zu binden, das es anzeigen soll, weisen Sie MainMenu der Menu-Eigenschaft des Formulars zu.
Sie können eine Vielzahl von MainMenu-Objekten einrichten, von denen jedes dem Benutzer unterschiedliche Menüeinträge anzeigt. Wenn Sie mehrere MainMenu-Objekte verwenden, um dem Benutzer die korrekte Menüstruktur anzuzeigen, hilft Ihnen dies, die bei der Benutzerinteraktion wechselnden Statusarten Ihrer Anwendung zu managen.
In der nachfolgenden Prozedur werden Sie eine Menüstruktur erstellen, die beim ersten Öffnen der Anwendung angezeigt wird, wenn noch keine Datei oder Daten vorliegen, mit denen der Benutzer interagieren kann. Die Anwendung enthält also nur ein ganz normales File-Menü mit den Befehlen New, Open und Exit. Wenn der Benutzer das Menüelement New auswählt, wird eine leere Microsoft Office Excel 2003-Arbeitsmappe geöffnet. Wenn der Benutzer das Menüelement Open auswählt, wird eine leere Excel-Arbeitsmappe geöffnet und mit einigen rudimentären Daten gefüllt. Die beiden Menüelemente New und Open lösen eine Veränderung im Anwendungsstatus aus, aufgrund der eine zweite Menüstruktur mit zusätzlichen Menüelementen (Close Workbook und Print Preview) für die Excel-Arbeitsmappe angezeigt wird.
Erstellen eines Menüs zur Entwurfszeit
Nachfolgend finden Sie schrittweise Anleitungen zur Erstellung einer Microsoft Windows®-Anwendung mit wechselnden Menüstrukturen im Windows Forms-Designer:
-
Starten Sie Microsoft Visual Studio® .NET, und erstellen Sie eine neue Visual Basic®-Windows-Anwendung.
-
Fügen Sie der Microsoft Excel-Objektbibliothek einen Verweis hinzu. Führen Sie dazu folgende Schritte aus:
-
Klicken Sie im Menü Projekt auf Verweis hinzufügen.
-
Klicken Sie auf die Registerkarte COM, suchen Sie nach der Microsoft Excel Object Library, und klicken Sie auf Auswählen.
-
Klicken Sie im Dialogfeld Verweis hinzufügen auf OK, um Ihre Auswahl zu bestätigen.
-
Ziehen Sie eine MainMenu-Komponente von der Toolbox auf das Formular, wie in Abbildung 1 dargestellt.
Abbildung 1. "MainMenu"-Komponente auf dem Formular
-
Erstellen Sie im Menü-Designer ein Menüelement der obersten Ebene, bei dem Sie die Text-Eigenschaft auf &File festlegen (nehmen Sie dazu einfach die entsprechende Eingabe im Feld Type Here (Hier eingeben) vor), sowie drei Untermenüelemente, bei denen Sie die Text-Eigenschaften auf &New, &Open und E&xit (in dieser Reihenfolge) festsetzen.
-
Klicken Sie nacheinander auf jedes dieser Menüelemente, und weisen Sie die Name-Eigenschaft gemäß der folgenden Tabelle zu:
Standardname
Neuer Name
MenuItem1
File
MenuItem2
New
MenuItem3
Open
MenuItem4
Exit
-
Klicken Sie im Windows Forms-Designer auf das Formular (Form1.vb), um den Fokus darauf zu richten. Überprüfen Sie im Fenster Eigenschaften, ob für die Menu-Eigenschaft das gerade von Ihnen erstellte Menü festgelegt ist (MainMenu1).
Verknüpfen der Ereignisse
.NET ermöglicht es Ihnen, mit einem einzigen Handler mehrere Ereignisse zu verarbeiten, wenn diese Ereignisse auf dieselbe Funktion weisen. Diese Art von Handler wird als Multicast-Ereignishandler bezeichnet.
-
Erstellen Sie einen Multicast-Ereignishandler für die beiden Exit-Menüelemente (ein bereits vorhandenes Exit-Menüelement und ein weiteres, das Sie in Kürze erstellen werden), indem Sie folgenden Eintrag hinzufügen:
Anmerkung Sie erstellen die Shell für diese Prozedur, indem Sie auf das Exit-Menüelement doppelklicken und dann nach der Handles Excel1.Click-Direktive den Eintrag Exit2.Click einfügen.
Private Sub Exit_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Exit.Click, _
Exit1.Click
' Shut down Excel.
oXL.Quit()
oXL = Nothing
End Sub
Bei dieser Unterroutine bedeuten die beiden Click-Ereignisse, die dem Schlüsselwort Handles folgen, dass durch Klicken auf eines der beiden Exit-Menüelemente die Anweisung zum Schließen von Form1 ausgeführt wird.
-
Erstellen Sie nun im Code-Editor eine Methode ähnlich der nachfolgenden, um für das Menü des Formulars die zweite MainMenu-Komponente festzulegen, die Sie im nächsten Schritt erstellen werden:
Private Sub LoadSecondMenu()
Me.Menu = MainMenu2
End Sub
Erstellen eines alternativen Menüs
-
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Formularnamen, und wählen Sie Designer anzeigen aus dem Kontextmenü aus.
-
Klicken Sie im Komponentenfach (Component Tray) auf das Symbol für die MainMenu1-Komponente (siehe Abbildung 2 unten), damit der Fokus darauf gerichtet ist.
Abbildung 2. Komponentenfach
-
Klicken Sie im Menü-Designer auf das von Ihnen erstellte Menüelement der obersten Ebene (File). Klicken Sie mit der rechten Maustaste, und wählen Sie Kopieren.
Anmerkung Damit erstellen Sie eine Kopie des Menüelements der obersten Ebene und all seiner Untermenüelemente.
-
Ziehen Sie eine weitere MainMenu-Komponente von der Toolbox auf das Formular.
-
Klicken Sie im Menü-Designer mit der rechten Maustaste auf den Bereich Type Here (Hier eingeben), und wählen Sie die Option Einfügen.
-
Die Menüelemente, die Sie zuvor aus der ersten MainMenu-Komponente ausgewählt haben, werden in die zweite MainMenu-Komponente eingefügt.
-
Klicken Sie im Menü-Designer mit der rechten Maustaste auf den Bereich links des Menüelements Exit, und wählen Sie Neue einfügen aus. Führen Sie diesen Schritt noch einmal durch, um insgesamt zwei neue Menüelemente einzufügen.
-
Legen Sie für die Text-Eigenschaft dieser beiden Menüelemente &Print Preview und &Close Workbook (in dieser Reihenfolge) fest. Verwenden Sie dazu entweder das Fenster Eigenschaften, oder klicken Sie auf das Element, und geben Sie den Namen in den dafür vorgesehenen Platz ein.
Abbildung 3. Alternatives Menü
-
Klicken Sie nacheinander auf jedes dieser Menüelemente, und weisen Sie die Name-Eigenschaft gemäß der folgenden Tabelle zu:
Standardname
Neuer Name
MenuItem5
File1
MenuItem6
New1
MenuItem7
Open1
MenuItem8
Print
MenuItem9
Close
MenuItem10
Exit1
Hinzufügen von weiteren Menüfunktionen
Mit der nachfolgenden Unterroutine öffnen Sie eine Excel-Instanz unter Verwendung eines als Automatisierung bezeichneten Prozesses. Automatisierung ermöglicht es in Sprachen wie Visual Basic oder C# (C Sharp ausgesprochen) geschriebenen Programmen, andere Anwendungen programmtechnisch zu steuern. Wie Sie hier sehen, können Sie mithilfe von Automatisierung verschiedene Vorgänge ausführen, wie beispielsweise eine neue Arbeitsmappe erstellen oder der Arbeitsmappe Daten hinzufügen. Wenn die Arbeitsmappe mit Daten gefüllt ist, wird die Funktion zum Laden des alternativen Menüs aufgerufen. Fügen Sie dem Codefenster Folgendes hinzu:
Public oXL As Excel.Application
Private Sub Open_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Open.Click, Open1.Click
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Get a new workbook.
oWB = oXL.Workbooks.Add
oSheet = oWB.ActiveSheet
' Add table headers to each column.
oSheet.Cells(1, 1).Value = "First Name"
oSheet.Cells(1, 2).Value = "Last Name"
' Populate with sample names.
oSheet.Cells(2, 1).Value = "Nancy"
oSheet.Cells(2, 2).Value = "Davolio"
oSheet.Cells(3, 1).Value = "Janet"
oSheet.Cells(3, 2).Value = "Leverling"
' Load the alternate menu.
LoadSecondMenu()
End Sub
Die nächste Unterroutine wird ausgeführt, sobald der Benutzer auf das Menüelement New klickt. Sie öffnet vor dem Laden des alternativen Menüs zunächst eine leere Arbeitsmappe. Fügen Sie dem Codefenster die folgende Unterroutine hinzu:
Private Sub New_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles New.Click, New1.Click
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Get a new blank workbook.
oWB = oXL.Workbooks.Add
oSheet = oWB.ActiveSheet
' Load the alternate menu.
LoadSecondMenu()
End Sub
Die nächste Unterroutine wird ausgeführt, wenn der Benutzer auf das Menüelement Print Preview klickt. Fügen Sie dem Codefenster die folgende Prozedur hinzu:
Private Sub Print_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Print.Click
' Print Preview menu item.
oXL.ActiveSheet.PrintPreview()
End Sub
Die letzte Prozedur schließt die Excel-Instanz, wenn der Benutzer auf das Menüelement Close Worksheet klickt. Fügen Sie dem Codefenster auch die folgende Prozedur hinzu:
Private Sub Close_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Close.Click
' Exit menu items.
Form1.ActiveForm.Close()
End Sub
Testen der Anwendung
Drücken Sie F5, um die Anwendung zu starten. Das Formular verfügt über ein Menü mit den Elementen File, New, Open und Exit. Wenn Sie auf New oder Open klicken, lösen Sie ein Ereignis aus, das von den entsprechenden Ereignishandlern verarbeitet wird. Diese Methoden laden entweder eine neue, leere Arbeitsmappe oder laden eine Arbeitsmappe und füllen diese dann mit Daten. Darüber hinaus ändern diese Methoden den Status der Anwendung durch Aufrufen der LoadSecondMenu-Unterroutine. Die Statusänderung der Anwendung ist dadurch erkennbar, dass im Menü zwei neue Elemente, Print Preview und Close Workbook, angezeigt werden.
Programmtechnisches Erstellen eines Menüs
Zusätzlich zum Erstellen von Menüs mithilfe von Windows Forms-Designer können Sie eine Windows-Anwendung auch programmtechnisch durch Verwendung des MainMenu-Objekts erstellen. Die folgende Unterroutine verwendet ein MainMenu-Objekt, das sich öffnet, sobald die Anwendung gestartet wird. Dieses enthält lediglich das herkömmliche Menü File mit den Befehlen New, Open und Exit. Der nachfolgende Code verwendet darüber hinaus eine überladene Add-Methode, die Menüelemente erstellt und Ereignishandler mit diesen verknüpft.
Anmerkung Um auf Member des Excel-Objektmodells zu verweisen, müssen Sie einen Verweis auf die Microsoft Excel-Objektbibliothek einrichten, wie im Abschnitt Erstellen eines Menüs zur Entwurfszeit erläutert.
' Create a MainMenu object and a MenuItem object.
Private mmAppStart as MainMenu
Private miFile as MenuItem
Public Sub AppStartMenu()
' Create an instance of the MainMenu object.
mmAppStart = new MainMenu
' Create a top-level menu item and two menu items. Use this
' overloaded constructor that takes an event handler
' (MenuSelect) so that later, you can cause the menu
' selection to change the application state.
miFile = New MenuItem("&File", _
New System.EventHandler (AddressOf Me.MenuSelect))
miFile.MenuItems.Add("&New", _
New System.EventHandler (AddressOf Me.MenuSelect))
miFile.MenuItems.Add("&Open", _
New System.EventHandler (AddressOf Me.MenuSelect))
miFile.MenuItems.Add("&Exit")
' Add the top-level menu item to the MainMenu component
' and set the MainMenu component to be the form's menu.
mmAppStart.MenuItems.Add(miFile)
' Set the form's menu to the menu you have just created.
Me.Menu = mmAppStart
End Sub
Programmtechnisches Erstellen von alternativen Menüs
Mit der nachfolgenden Prozedur erstellen Sie eine zweite Instanz einer MainMenu-Komponente mit Menüelementen für einen zweiten Anwendungsstatus. In diesem Beispiel können Sie Befehle zum Anzeigen der Arbeitsmappe in der Vorschau sowie zum Schließen der Arbeitsmappe verfügbar machen, wenn der Benutzer eine Datei geöffnet hat.
' Create the alternate MainMain object.
Private mmFileLoadedMenu As MainMenu
Public Sub FileLoadedMenu()
mmFileLoadedMenu = New MainMenu()
' Clone the first menu with the CloneMenu method.
mmFileLoadedMenu.MenuItems.Add(miFile.CloneMenu())
' Create two additional menu items related to the
' application state.
Dim mnuitemPrintPre As New MenuItem("&Print_Preview", _
New System.EventHandler(AddressOf Me.MenuSelect))
Dim mnuitemClose As New MenuItem("&Close_Workbook", _
New System.EventHandler(AddressOf Me.MenuSelect))
' Add the two new menu items to the MenuItems collection of the
' top-level menu item cloned above, using the Add method to
' specify their order within the collection by their index.
mmFileLoadedMenu.MenuItems(0).MenuItems.Add((2), mnuitemPrintPre)
mmFileLoadedMenu.MenuItems(0).MenuItems.Add((3), mnuitemClose)
' Assign the newly-created MainMenu object to the form.
Me.Menu = mmFileLoadedMenu
End Sub
Fügen Sie dem Form1-Konstruktor nach dem InitializeComponent-Methodenaufruf eine Codezeile hinzu, um die zuvor erstellte AppStartMenu-Methode aufzurufen:
AppStartMenu()
Erstellen Sie dann innerhalb der Klasse einen Ereignishandler, um jedem der Menüelemente Funktionen hinzuzufügen und die Menu-Eigenschaft des Formulars auf FileLoadedMenu umzustellen. Die Unterroutine fügt Funktionen mithilfe der Select Case..End Select-Anweisung basierend auf dem Wert des Menüelements hinzu, auf das geklickt wurde.
Protected Sub MenuSelect(ByVal sender As Object, _
ByVal e As System.EventArgs)
Dim itemClicked As New MenuItem()
itemClicked = CType(sender, MenuItem)
' Console.WriteLine("You have selected the item " & _
itemClicked.Text)
Select Case itemClicked.Text
Case "&New"
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Get a new blank workbook.
oWB = oXL.Workbooks.Add
oSheet = oWB.ActiveSheet
Case "&Open"
Dim oWB As Excel.Workbook
Dim oSheet As Excel.Worksheet
oXL = CreateObject("Excel.Application")
oXL.Visible = True
' Get a new workbook.
oWB = oXL.Workbooks.Add
oSheet = oWB.ActiveSheet
' Add table headers to each column.
oSheet.Cells(1, 1).Value = "First Name"
oSheet.Cells(1, 2).Value = "Last Name"
' Populate with sample names.
oSheet.Cells(2, 1).Value = "Nancy"
oSheet.Cells(2, 2).Value = "Davolio"
oSheet.Cells(3, 1).Value = "Janet"
oSheet.Cells(3, 2).Value = "Leverling"
Case "E&xit"
' Shut down Excel.
oXL.Quit()
oXL = Nothing
Case "&Print_Preview"
oXL.ActiveSheet.PrintPreview()
Case "&Close_Workbook"
Form1.ActiveForm.Close()
End Select
FileLoadedMenu()
End Sub
Schlussfolgerung
In dieser Kolumne haben wir uns mit zwei verschiedenen Möglichkeiten beschäftigt, wie Sie Ihren .NET-Anwendungen Menüs hinzufügen können. Eine der beiden Methoden beinhaltete das Erstellen von Menüs zur Entwurfszeit. Bei der anderen Methode wurden die Menüs zur Laufzeit programmtechnisch erstellt. In Abhängigkeit von Ihren Anwendungen können Sie eine oder beide dieser Methoden einsetzen. Die in diesem Artikel beschriebenen Techniken ermöglichen es Ihnen, Ihre .NET-Anwendungen vielseitiger zu gestalten.