Feedback

C# - Eigene MessageBoxen erstellen und anzeigen

Veröffentlicht von am 27.12.2012
(1 Bewertungen)
In diesem Snippet erkläre ich, wie man mit der message-Klasse einfach eigene MessageBoxen erstellt.

Vorerst musst Du eine Vorlage (Formular) für die MessageBox designen (MessageForm). Es sollten vorhanden sein:
- Wenn kein Standardfenster benutzt wird: Label für Titel (lbTitle)
- Label für Text (lbText)
- Label für Bild (lbImage)
- Schaltfläche (Button od. Label) mit Aufschrift "Ja" (btYes)
- Schaltfläche (Button od. Label) mit Aufschrift "Nein" (btNo)

MessageBox anzeigen:
CustomMessageBox.Show("Mitteilungstext", "Titel", MessageBoxButtons.OK, SystemIcons.Information, new MessageForm());


Folgende Zeile muss in die Load-Methode der Vorlage:
CustomMessageBox.GetMessage(lbText, lbTitle, lbImage, btYes, btNo);

Soll der Titel in der Head-Leiste des Fensters angezeigt werden, ersetzt man lbTitle einfach durch this. Dann wird der Formulartext angepasst. :)

Wie man vielleicht sieht werden jedoch nur Ja-Nein- und OK-Boxen unterstützt. Bei anderen MessageBoxButtons wird eine OK-Meldung angezeigt. ;D

Dies ist die neue Version der Message-Klasse.
Sie ist deutlich sauberer und schneller, kleiner, und einfacher zu benutzen. --> Nur 2 Methoden!!
using System;
using System.Windows.Forms;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace DariusArnold
{
    public static class CustomMessageBox
    {
        private static string text, title;
        private static MessageBoxButtons buttons;
        private static System.Drawing.Image img;
        private static DialogResult result;
        private static Form form;

        public static DialogResult Show (string mText, string mTitle, MessageBoxButtons mButtons, System.Drawing.Image mImg, Form mForm)
        {
            text = mText;
            title = mTitle;
            buttons = mButtons;
            img = mImg;
            form = mForm;
            form.ShowDialog();
            return result;
        }

        public static void GetMessage(Control mTextControl, Control mTitleControl, Control mImgControl, Control btYes, Control btNo)
        {
            mTextControl.Text = text;
            mTitleControl.Text = title;
            if (buttons != MessageBoxButtons.YesNo)
            {
                btYes.Visible = false;
                btNo.Text = "OK";
            }
            btYes.Click += new EventHandler(Yes);
            btNo.Click += new EventHandler(No);
            mImgControl.BackgroundImageLayout = ImageLayout.Center;
            mImgControl.BackgroundImage = img;
            result = DialogResult.Abort;
        }

        private static void Yes(object sender, EventArgs e)
        {
            result = DialogResult.Yes;
            form.Close();
        }

        private static void No(object sender, EventArgs e)
        {
            result = DialogResult.No;
            form.Close();
        }
    }
}
Abgelegt unter MessageBox.

4 Kommentare zum Snippet

Lala-Mann schrieb am 07.06.2013:
Praktisch.
Gut zu gebrauchen, wenn man ein eigenes UI gebaut hat und entsprechende Message-Boxen braucht.

Danke für dieses Snippet. :-)
geier99 schrieb am 28.12.2015:
Vielen Dank, obiges hat mir sehr weitergeholfen! :-)

Allerdings musste ich bei mir (Visual Studio Express 2012 für Windows Desktop)

im Aufruf zum Anzeigen der MessageBox:

SystemIcons.Information

durch:

SystemIcons.Information.ToBitmap()

ersetzen.
Gerhard schrieb am 23.01.2016:
Das hier ergibt eine System.NullReferenceException:

private static void No(object sender, EventArgs e)
{
result = DialogResult.No;
form.Close(); //<-- das hier
}

Auch ist mir nicht klar, wie sich die Klasse CustomMessageBox zum Hauptformular (Form1) verhält.
Hier mein vollständiger Code:

namespace Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
CustomMessageBox.GetMessage(lbText, lbTitle, lbImage, btYes, btNo);
}
}

public static class CustomMessageBox
{
private static string text, title;
private static MessageBoxButtons buttons;
private static System.Drawing.Image img;
private static DialogResult result;
private static Form form;

public static DialogResult Show (string mText, string mTitle, MessageBoxButtons mButtons, System.Drawing.Image mImg, Form mForm)
{
text = mText;
title = mTitle;
buttons = mButtons;
img = mImg;
form = mForm;
form.ShowDialog();
return result;
}

public static void GetMessage(Control mTextControl, Control mTitleControl, Control mImgControl, Control btYes, Control btNo)
{
mTextControl.Text = text;
mTitleControl.Text = title;
if (buttons != MessageBoxButtons.YesNo)
{
btYes.Visible = false;
btNo.Text = "Ja doch";
}
btYes.Click += new EventHandler(Yes);
btNo.Click += new EventHandler(No);
mImgControl.BackgroundImageLayout = ImageLayout.Center;
mImgControl.BackgroundImage = img;
result = DialogResult.Abort;
}

private static void Yes(object sender, EventArgs e)
{
result = DialogResult.Yes;
form.Close();
}

private static void No(object sender, EventArgs e)
{
result = DialogResult.No;
form.Close();
}
}
}
dariusarnold schrieb am 20.12.2017:
Auch, wenn der Kommentar schon älter ist:
Die Klasse dient zur schnellen Übertragung von MessageBox-Funktionalitäten auf eine eigene Form. Diese Form muss selbst erstellt und instanziert werden, um dann an ShowDialog(...) übergeben zu werden. NullReferenceException tritt auf, wenn deine Form "leer" bzw. nicht zugewiesen oder instanziert ist.
CustomMessageBox.ShowDialog(..., new MeineForm());

Für diese Form (in der Regel also wahrscheinlich aus der Form selber) wird dann GetMessage(...) aufgerufen und die jeweiligen Controls übergeben, die für die MessageBox-Funktionalitäten eingesetzt werden.

Zum Thema MessageBoxIcons. Es ist richtig, dass SystemIcons nicht direkt funktionieren, weil sie vom Typ Icon sind. Da die Image-Eigenschaft des Bildlabels, aber den Typ Image erwartet, habe ich auch als Parameter Image eingebaut, damit dem Nutzer die Möglichkeit bleibt, für die eigene[/b] MessageBox auch [u]eigene Icons zu verwenden. Wer trotzdem ein SystemIcon mag, kann das schnell in eine Bitmap konvertieren. Wer ausschließlich SystemIcons zulassen möchte, kann den Parametertyp im Methodenkopf auch zu SystemIcon ändern und innerhalb der Methode konvertieren.
 

Logge dich ein, um hier zu kommentieren!