BigBastis Blog

C#: Eigene Dialoge erstellen

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

C#: Eigene Dialoge erstellen

Posted on .

In der Windows Forms Welt benutzt man Dialoge sehr häufig, egal ob es der OpenFileDialog, SaveFileDialog, PrintDialog, ColorDialog oder einfach nur die simple MessageBox ist, sie erleichtern uns der Leben sehr. So wäre auch ein Dialog sehr nützlich der Benutzereingaben entgegen nimmt und uns diese dann weitergibt, doch so einen Dialog finden wir nur im VisualBasic Namespace in .NET.

Bild 1: Das InputBox Dialogfenster

Der InputBox Dialog nimmt Eingaben vom Benutzer entgegen und gibt diese an unser Programm weiter. Doch was wenn wir den Benutzer nach einem Passwort fragen möchten? InputBox kann den eingegebenen Text leider nicht maskieren. So muss ein eigener Dialog für die Passworteingabe her.

Zum Glück ist diese Aufgabe im .NET Framework wirklich schnell erledigt. In VB.NET gibt es unter Windows Forms sogar extra eine Vorlage für ein Dialogfenster. Aber nun mal Langsam.

Alles was wir benötigen ist ein normale Klasse die von System.Windows.Forms.Form erbt. Dieses Fenster könnt ihr nun so gestalten, wie ihr euch euer Passwortdialogfenster so vorstellt. Ich habe meins so gestaltet:

Bild 2: Mein PasswortDialog Fenster

Bevor wir uns nun an die Innereien dieser Fensterklasse machen müssen wir noch ein paar Kleinigkeiten mit dem Designer vornehmen. Wir müssen nämlich angeben, welche Aktionen zu welchen Dialog Ergebnis führen.

So soll das Klicken des OK-Buttons das DialogResult „OK“ Auslösen, der Abbrechen-Button und der X-Button (Fenster schließen) aber das „Cancel“ DialogResult. Dementsprechend stellt man die gleichnamige Eigenschaft der Buttons auf „OK“ oder „Cancel“.

Um dem Benutzer später das Arbeiten mit diesem Fenster intuitiver zu machen kann man nun noch den Form Eigenschaften „AcceptButton“ und „CancelButton“ die passenden Buttons zuweisen. Das sorgt dafür dass der Benutzer später das Dialog Fenster mit der Taste „Enter“ bestätigen oder mit „Escape“ abbrechen kann.

Bereits jetzt, ohne auch nur eine Zeile Code geschrieben zu haben funktioniert dieses Fenster wie ein vollwertiger Dialog. Sogar die Buttons, für die wir keinen Code hinterlegt haben schließen beim Klicken das Fenster und übergeben das passende DialogResult.

Alles was wir nun noch machen müssen ist, Parameter anzubieten mit denen wir den Text auf dem Formular modifizieren können und vielleicht die Anzahl der Buttons die angezeigt werden sollen:

public partial class PasswordDialog : Form {

    /// Das vom Benutzer eingegebene Passwort
    public string EnteredPassword {get; private set;}

    /// Erzeugt ein neues Password Dialog
    public PasswordDialog(string windowTitle, string messageTitle,
                            string messageDescription,
                            DialogButtons buttons = DialogButtons.OKCancel,
                            bool windowClosable = true) {

        InitializeComponent();

        //Übergebene Werte übernehmen
        this.Text = windowTitle;
        this.lblTitle.Text = messageTitle;
        this.lblDescription.Text = messageDescription;

        //Optionale Parameter bearbeiten
        if (buttons == DialogButtons.OK) {
            //Wenn nur der OK Button angezeigt werden
            //soll den Cancel Button ausblenden
            this.cmdCancel.Visible = false;
        }

        if (windowClosable == false) {
            //Schließen Button bei Bedarf ausblenden
            this.ControlBox = false;
        }

        EnteredPassword = "";       //Property initialisieren
    }

    private void PasswordDialog_Load(object sender, EventArgs e) {

    }

    private void cmdCancel_Click(object sender, EventArgs e) {
        //Dem Aufrufer mitteilen, dass der Dialog abgebrchen wurde
        //this.DialogResult = System.Windows.Forms.DialogResult.Cancel;
    }

    private void cmdOK_Click(object sender, EventArgs e) {
        //Eingabe übernehmen
        EnteredPassword = txtPassword.Text;
    }
}

public enum DialogButtons {
    OK = 0,
    OKCancel = 1
}

Hier passiert eigentlich nichts aufregendes, im Konstruktor werden nur alle übergebenen Parameter auf das Formular übertragen (Text, Buttons…)  und die Property für das Passwort initialisiert. Schließlich wird noch bei dem Klick auf den OK-Button der Text in der TextBox noch in der Property gespeichert und dann wird das Formular auch schon mit dem passenden DialogResult geschlossen.

Wenn wir das Ganze nun nutzen wollen dann kann das wie folgt aussehen:

private void cmdShowDialog_Click(object sender, EventArgs e) {
    PasswordDialog pass = new PasswordDialog("Passwort benötigt",
                                        "Bitte geben Sie Ihr Passwort an",
                                        "Wenn Sie Zugriff auf erweiterte " +
                                        "Funktionen benötigen müssen Sie Sich" +
                                        "mit Ihrem Passwort Authentifizieren");
    DialogResult res = pass.ShowDialog();

    if (res == System.Windows.Forms.DialogResult.OK) {
        this.txtDialogResult.Text = pass.EnteredPassword;
    } else {
        this.txtDialogResult.Text = "Der Benutzer hat den Dialog abgebrochen";
    }
}

Bild 3: Die DemoAnwendung

Das wars auch schon. So schnell hat man einen eigenen Dialog erstellt.

An dieser Stelle noch der Hinweis, dass der oben gezeigte Quelltext nur mit .NET 4.0 kompiliert werden kann, da ich hier Optionale Parameter benutzt habe. Wenn ihr diese rausnehmt dann läuft dieser Code problemlos auch mit älteren .NET Versionen.

Hier habe ich für euch auch noch ein kleines Demoprojekt gebastelt:

Download: VS2010 C# .NET4.0
kick it on dotnet-kicks.de

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author bigbasti87

Posted at 14:02 2. November 2010.

Bloggd: C#: Eigene Dialoge erstellen – http://blog.bigbasti.com/c-eigene-dialog

user

Author Mangafreak1995

Posted at 16:41 2. November 2010.

Wieso muss man .Net 4 haben um optionale Parameter zu verwenden ? … geht das nicht schon von Anfang an ? … ich meine bei VB geht es schon von Anfang mit optionale Parameter

user

Author admin

Posted at 17:09 2. November 2010.

Meine obige Aussage bezog sich auf C# wo Optionale und Named Parameter als Feature von C# 4.0 unter .NET 4.0 eingeführt wurden. In VB gibts diese schon seit einer Ewigkeit 🙂

user

Author Maximilian

Posted at 19:12 2. November 2010.

Man könnte das auch einfach mit Überladungen der entsprechenden Methode lösen, so wie z.B. bei MessageBox.Show(…); dann muss man nicht zwingend .NET 4.0 verwenden 🙂

Cheerio

user

Author admin

Posted at 22:22 2. November 2010.

Wie im Artikel bereits erwähnt ist dies ein Feature von .NET 4.0 – man kann es auch anders lösen wie zB. mit Überladungen (wie Maximilian gesagt hat) – diese anderen Lösungen sind in meinen Augen aber unschön(er) und blähen den Code einfach nur auf – was in einem Blogartikel nicht toll rüberkommt, deswegen benutze ich da wo es geht die aktuellste Version von .NET und wenn ihr es für andere Versionen umschreibt müsst ihr halt gucken wo ihr bleibt 😉

user

Author Dom

Posted at 15:40 16. Juli 2011.

Hey,

ich hab da ein kleines Problem mit deiner Funktion. Wenn ich das verwenden möchte, dann schreit er mir trotz .NET 4 Framework
„Error 3 Method must have a return type“

Setze ich ein Void geht der Fehler weg, allerdings bleibt mein Fenster leer. Das ist noch so eine komische Sache. Weißt du woran das liegen kann?

user

Author admin

Posted at 15:56 16. Juli 2011.

Hallo, brauche da mehr Informationen, welche Funktion? Wie benutzt du sie? Mit deine Infos kann ich leider nicht viel anfangen.
Gruß basti

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (7) ...
Navigation