11.10 Meldungsfenster mit MessageBox
Sicherlich sind Ihnen modale Dialoge wie der aus Abbildung 11.12 bekannt.
Abbildung 11.12 Typisches modales Dialogfenster
Weil modale Dialogfenster sehr häufig zur einfachen Interaktion mit dem Anwender oder auch nur zur Bereitstellung von Information in Applikationen eingesetzt werden, ist im Namensraum System.Windows.Forms eine Klasse vordefiniert, mit der die meisten Anforderungen erfüllt werden können. Es handelt sich um MessageBox. Der abgebildete Dialog beruht auf der folgenden Anweisung:
MessageBox.Show("Wollen Sie die Anwendung beenden?", "Anwendungsmeldung", _ MessageBoxButtons.YesNo, MessageBoxIcon.Question, _ MessageBoxDefaultButton.Button2);
Der Code beschreibt sich nahezu von selbst: Im ersten Argument wird der Meldungstext übergeben, im zweiten die Beschriftung der Titelleiste, im dritten die anzuzeigenden Schaltflächen. Das vierte Argument beschreibt das Symbol im Clientbereich des Meldungsfensters, und das letzte Argument gibt vor, welche Schaltfläche nach dem Start der Anzeige fokussiert werden soll.
Der Programmcode, den man benötigt, um ein Meldungsfenster anzuzeigen, ist bedeutend kürzer und einfacher als der eines benutzerdefinierten Dialogs. Dennoch sind modalen Dialogen, die auf der Klasse MessageBox basieren, Grenzen gesetzt, denn der Anwender wird nur mit Hinweisen und Informationen versorgt, auf die er durch das Anklicken einer Schaltfläche reagiert, um damit den weiteren Programmablauf zu beeinflussen.
11.10.1 Anzeige mit Show
MessageBox verfügt nur über eine typspezifische Methode: Es ist die 21-fach überladene statische Methode Show. Die einfachste ist die, die nur die Zeichenfolge des Meldungstextes entgegennimmt:
MessageBox.Show("Visual C# macht Spass");
Ein solches Meldungsfenster verfügt nur über eine OK-Schaltfläche. Klickt der Anwender auf diese, wird das Meldungsfenster geschlossen.
Optisch wirkt eine leere Titelleiste stümperhaft. Meist werden Sie daher dieser auch eine Zeichenfolge übergeben wollen. Üblicherweise verwendet man dazu den Namen der Anwendung, den man auch aus der statischen Eigenschaft ProductName der Klasse Application beziehen kann:
MessageBox.Show("Visual C# macht Spass", Application.ProductName);
In einem dritten Argument können Sie die im Meldungsfenster angezeigten Schaltflächen festlegen. Dazu übergeben Sie eine der Enumeration MessageBoxButtons vordefinierten Konstanten:
Konstante | Das Meldungsfenster enthält die Schaltfläche(n) |
AbortRetryIgnore |
Beenden, Wiederholen und Ignorieren. |
OK |
OK. |
OKCancel |
OK und Abbrechen. |
RetryCancel |
Wiederholen und Abbrechen. |
YesNo |
Ja und Nein. |
YesNoCancel |
Ja, Nein und Abbrechen. |
Wollen Sie im linken Bereich des Meldungsfensters ein Symbol anzeigen lassen, haben Sie tatsächlich nur vier verschiedene Alternativen, obwohl in der Liste der MessageBoxIcon-Aufzählung neun aufgeführt sind:
Konstante(n) | Das Symbol im Meldungsfenster ist |
None |
nicht vorhanden |
Hand, Stop, Error |
ein weißes X in einem Kreis mit rotem Hintergrund |
Question |
ein Fragezeichen in einem Kreis |
Exclamation, Warning |
ein Ausrufezeichen in einem Dreieck mit gelbem Hintergrund |
Asterisk, Information |
der Kleinbuchstabe »i« in einem Kreis |
Wenn Sie ein Meldungsfenster mit mehreren Schaltflächen erzeugen, kommt der Wahl der vorfokussierten Schaltfläche eine besondere Bedeutung zu. Nehmen wir beispielsweise das folgende Meldungsfenster:
MessageBox.Show("Wollen Sie die Anwendung beenden?", _ Application.ProductName, MessageBoxButtons.YesNo, MessageBoxIcon.Question)
Standardmäßig ist die linke Schaltfläche (OK) fokussiert und reagiert nicht nur auf einen Mausklick, sondern auch auf die Eingabe- und Leertaste. Es wäre fatal, wenn in einem Formular viele Einträge gemacht worden sind, der Anwender versehentlich auf die Schliessen-Schaltfläche der Form klickt und dann in seiner Hektik danach noch zu schnell auf die -Taste drückt – seine Arbeit wäre verloren. Sie als Entwickler sollten diese Situation vermeiden. Dazu fokussieren Sie einfach die Schaltfläche im Meldungsfenster, die nicht das Schließen der Form oder gar der Anwendung zur Folge hat. Der auf die Festlegung des Icons folgende Parameter der Show-Methode vom Typ MessageBoxDefaultButton legt die vorausgewählte Schaltfläche fest:
Konstante | Vorfokussierte Schaltfläche im Meldungsfenster ist die |
Button1 |
erste Schaltfläche |
Button2 |
zweite Schaltfläche von links |
Button3 |
rechte Schaltfläche |
Weitere optionale Parameter ermöglichen über die aufgeführten Fähigkeiten hinaus die Anzeige einer Hilfe-Schaltfläche und die Verknüpfung zu einer passenden Hilfedatei.
11.10.2 Rückgabewert der Meldungsfenster
Wenn das Meldungsfenster nur einen OK-Button zeigt, erübrigt sich die Auswertung dieser Schaltfläche. Werden jedoch mehrere Schaltflächen angeboten, müssen Sie auswerten, welche der Anwender angeklickt hat. Die Information, welche Schaltfläche des Meldungsfensters zum Schließen geführt hat, bezieht man über den Rückgabewert der Methode MessageBox.Show, der vom Typ DialogResult ist. Die Mitglieder dieser Enumeration sind schon in Tabelle 11.13 vorgestellt worden.
Im folgenden Ereignishandler einer Schaltfläche wird ein Meldungsfenster angezeigt, das den Anwender um Bestätigung bittet, ob er die Anwendung schließen möchte oder nicht. Der Code reagiert in Abhängigkeit von der im Meldungsfenster gewählten Schaltfläche.
Private Sub btnSchliessen_Click(sender As Object, e As EventArgs e) Dim strMeldung As String = "Wollen Sie die Anwendung beenden?" Dim result As DialogResult = MessageBox.Show( _ strMeldung, Application.ProductName, _ MessageBoxButtons.OKCancel, MessageBoxIcon.Question, _ MessageBoxDefaultButton.Button2); If result = DialogResult.OK Then Application.Exit(); Else ' Reaktion auf 'Abbrechen', falls notwendig End If End Sub
Die Abbrechen-Schaltfläche wird vorfokussiert, um ein versehentliches Schließen der Anwendung zu vermeiden. In einer If-Anweisung wird der Rückgabewert überprüft. Hat der Anwender auf OK geklickt, wird die Anwendung unweigerlich geschlossen, ansonsten kann eine andere Reaktion erfolgen. In den meisten Fällen ist bei der Rückgabe DialogResult.Cancel kein Code erforderlich.
Alternativ könnte der gesamte If-Block auch durch Select-Case ersetzt werden:
Select result Case DialogResult.OK: Application.Exit() Case DialogResult.Cancel: ' Reaktion auf 'Abbrechen', falls notwendig End Select
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.