myCSharp.de - DIE C# und .NET Community (https://www.mycsharp.de/wbb2/index.php)
- Knowledge Base (https://www.mycsharp.de/wbb2/board.php?boardid=68)
-- Artikel (https://www.mycsharp.de/wbb2/board.php?boardid=69)
--- [Tutorial] InputBox selbermachen - Grundgerüst (https://www.mycsharp.de/wbb2/thread.php?threadid=23072)


Geschrieben von nic4x4 am 03.08.2006 um 17:11:
  [Tutorial] InputBox selbermachen - Grundgerüst
In diesem kleinen Tutorial geht es darum eine eigene InputBox zu entwerfen und funktionsfähig zu machen.
Wenn Fehler drinne sein sollten, bitte auf jeden Fall Bescheid geben.
Das soll ein Grundgerüst darstellen und überhaupt das Prinzip der Kommunikation zwischen 2 Formen veranschaulichen (besonders bei ShowDialog()).

Designen:
Zunächst mal erstellt man eine neue Form, die einen eindeutigen Namen, wie z. Bs. „frmInputBox.cs“ bekommt.

Folgende Eigenschaften müssen passend eingestellt werden:
- FormBorderStyle = FixedSingle (oder FixedToolBox)
- KeyPreview = true (damit man mit der Eingabetaste die InputBox bestätigen kann)
- MinBox = false
- MaxBox = false
- ShowIcon = false
- ShowInTaskbar = false
- StartPosition = CenterParent (damit die Form zentriert über dem Aufrufer erscheint)

Danach plaziert man 1 Label, 1 Textfeld und 2 Buttons, die zu lblDescription, txtInput und bttOK bzw. bttCancel umgetauft werden.

Etwa so kann man die Steuerelemente dann anordnen:


Jetzt muss man noch die DialogResult – Eigenschaften der beiden Buttons richtig setzen. OK bzw. Cancel.
Bei der Form selbst, ordnet man der AcceptButton Eigenschaft den bttOK Button zu und bei CancelButton den bttCancel Button.


Code:
Man muss jetzt also 3 Eigenschaften kapseln: den Fenstertext (Bezeichnung des Formulars), die Beschreibung (die lblDescription zugewiesen wird) und die Benutzereingabe.
Das geschiet folgendermaßen:

C#-Code:
/// <summary>
/// Legt den Fenstertext fest oder gibt diesen zurück.
/// </summary>
public string WindowTitle
{
    get { return this.Text; }
    set { this.Text = value; }
}

/// <summary>
/// Legt die Beschreibung, die über dem Eingabefeld erscheint, fest oder gibt diese zurück.
/// </summary>
public string Description
{
    get { return lblDescription.Text; }
    set { lblDescription.Text = value; }
}

/// <summary>
/// Legt die Benutzereingabe fest oder gibt diese zurück
/// </summary>
public string Default
{
    get { return txtInput.Text; }
    set { txtInput.Text = value; }
}

Wenn man die “frmInputBox” jetzt instanzieren würde, hätte das Objekt also drei neue Eigenschaften (WindowTitle, Description und Default) hinzubekommen, die man frei setzen und abrufen kann:

C#-Code:
frmInputBox InputBox = new frmInputBox();
InputBox.WindowTitle = “Eingabe erwartet”;
InputBox.Description = “Geben Sie irgendwas ein:”;

Es ist aber auch ganz praktisch, wenn man die die Eigenschaften direkt beim Instanzieren setzen kann. Dafür muss der Konstruktor überladen werden:

C#-Code:
/// <summary>
/// Initialisiert die InputBox mit den übergebenen Werten
/// </summary>
/// <param name="Description">Beschreibung, die über dem Eingabefeld steht</param>
/// <param name="Fenstertext"></param>
/// <param name="Default">Vorgegebene Benutzereingabe</param>
public frmInputBox(string Description, string Fenstertext, string Default)
    : this()
{
    this.Description = Description;
    this.WindowTitle = Fenstertext;
    txtInput.Text = Default;
}

Man kann sich also entscheiden, ob man nichts übergibt oder gleich alle drei Werte. Wenn ein Wert nicht bekannt sein sollte, kann man schließlich auch „“ schreiben.

Zum Schluss noch das Click – Ereignis des bttCancel – Buttons anpassen:

C#-Code:
// Wird aufgerufen, wenn auf "Abbrechen" geklickt wird
private void bttCancel_Click(object sender, EventArgs e)
{
    // Text zurücksetzen
    txtInput.Text = "";
}

Somit ist gewährleistet, dass die Benutzereingabe gelöscht wird, falls der Benutzer auf „Abbrechen“ klickt.

So. Nun ist die ganze Sache eigentlich auch schon fertig.
Man kann jetzt die InputBox folgendermaßen auswerten:
(das kommt in eine andere Form!)

C#-Code:
private void button1_Click(object sender, EventArgs e)
{
    frmInputBox InputBox = new frmInputBox("Geben Sie einen Suchbegriff ein:", "Suchen", "");

    if (InputBox.ShowDialog() == DialogResult.OK)
    {
        MessageBox.Show("Sie haben " + InputBox.Default + " eingegeben.");
    }
    else
    {
        MessageBox.Show("Abgebrochen!");
    }
}

Wegen diesem Thread erstellt:  Link


Geschrieben von frisch am 03.08.2006 um 17:21:
 
Hallo nic4x4,

wie lange machst du schon c#? Für mich sehen da nämlich manche Programmstellen so aus, als könnten sie besonders Anfänger verwirren, wo doch ein Tutorial eigentlich dazu da ist, einen Anfänger langsam an das eigentliche Ziel heranführen sollte.

Ganz besonders ist mir hier

C#-Code:
public frmInputBox(string Description, string Fenstertext, string Default)
    : this()
{
    this.Description = Description;
    this.WindowTitle = Fenstertext;
    txtInput.Text = Default;
}

aufgefallen. Die Parameter sollten auf jedenfall ausschlagkräftiger benannt werden und imho wäre es besser, wenn CamelCase verwendet wird. So würde z. B. folgendes einem Anfänger besser verdeutlichen, was eigentlich was ist:

C#-Code:
public frmInputBox(string paramBeschreibung, string paramFenstertitel, string paramStandartText)
    : this()
{
    this.Description = paramBeschreibung;
    this.WindowTitle = paramFenstertitel;
    txtInput.Text = paramStandartText;
}

Aber bleib am Ball, man lernt ja aus Fehlern großes Grinsen


Geschrieben von webstarg am 03.08.2006 um 17:24:
 
Daumen hoch
webstarg


Geschrieben von nic4x4 am 03.08.2006 um 17:33:
 
@frisch
seit nem Monat mach ich das ungefähr.
Naja, ich wollte es eigentlich für GNewMan schreiben, der ein Problem hatte.
Und ich wollte auch natürlich erfahren wie man das besser machen kann (steht ja oben).

Thx


Geschrieben von frisch am 03.08.2006 um 17:36:
 
Zitat:
Und ich wollte auch natürlich erfahren wie man das besser machen kann (steht ja oben).

Na schonmal Anfängerfreundlicher gestalten großes Grinsen

Ansonsten würde ich das Tutorial eher als Tutorial für ein simples UserControl oder Properties sehen als für eine Kommunikation zwischen 2 Forms.


Geschrieben von herbivore am 04.08.2006 um 09:00:
 
Hallo zusammen,

ich finde das Tutorial gar nicht schlecht. Sicher sollte camelCase für alle variablenNamen verwendet werden (oder wenn der Name nur aus einem Wort besteht, eben kleinschreibung) und PascalCase für den KlassenNamen. Wäre nett, wenn du, nic4x4, das noch anpassen würdest. Und auch InputBox.WindowTitle braucht man nicht wirklich, weil man ja InputBox.Text benutzen kann, um den Fenstertitel zu setzen. Aber ist sonst noch was? Ich habe beim schnellen Drübergucken nichts gefunden. Na gut, nett wäre noch, den gesamten (gecamelCasten :-) Quelltext der InputBox als Dateianhang zur Verfügung zu stellen.

Ich habe das Tutorial (in der Hoffnung, dass diese Überarbeitungen erfolgen) mal ins Artikelforum gestellt.

herbivore


Geschrieben von Rainbird am 04.08.2006 um 09:51:
 
Zitat:
Original von frisch

C#-Code:
public frmInputBox(string paramBeschreibung, string paramFenstertitel, string paramStandartText)
    : this()
{
    this.Description = paramBeschreibung;
    this.WindowTitle = paramFenstertitel;
    txtInput.Text = paramStandartText;
}

Ich setze kein "param" vor meine Parameternamen. Hast Du das irgendwo im .NET Framework schon mal gesehen? Ich nämlich nicht.


Geschrieben von norman_timo am 04.08.2006 um 10:00:
 
Hallo frisch und Rainbird,

Zitat:
Ich setze kein "param" vor meine Parameternamen. Hast Du das irgendwo im .NET Framework schon mal gesehen? Ich nämlich nicht.

wir in unserer Firma haben uns nun darauf geeinigt, dass wir "p_" vor unseren Parametern setzen, das hat zum einen damit zu tun, dass wir C++ Code und C# Code gleichzeitig programmieren. Für C++ hat sich hier die ungarische Notation festgesetzt, und das wird aus lesbarkeitsgründen nun auch in C# so eingehalten.

Es hat teilweise den Vorteil, membervariablen von lokalen Variablen und Parametern zu unterscheiden, und das finde ich prinzipiell nicht verkehrt.

Genauso reagiert das Intellisense natürlich. Wenn ich schon "p_" eingebe erhalte ich alle Parameter...

Deshalb finde ich eine solche Kennzeichnung überhaupt nicht verwerflich. Allerdings würde ich definitiv nicht das Wort "param" verwenden, denn das verwirrt aufgrunddessen, dass das ein Schlüsselwort in C# ist, und bei der Eingabe dementsprechend gehighlighted (<- Ich liebe Denglisch :-) wird.

Gruß
Norman-Timo


Geschrieben von Xqgene am 04.08.2006 um 10:09:
 
@nic4x4

ich würde deine InputBox noch um ein paar statische Methoden erweitern. dan würde es etwa so aussehen:

C#-Code:
public partial class InputBox : Form
{
        private InputBox(string caption, string description, string defaultValue)
        {
            InitializeComponent();

            this.Text = caption;
            this.lblDescription.Text = description;
            this.txtInput.Text = defaultValue;
        }

        public static DialogResult ShowDialog(ref string inputValue)
        {
            return ShowDialog("Geben Sie hier einen Wert ein:", ref inputValue);
        }

        public static DialogResult ShowDialog(string description, ref string inputValue)
        {
            return ShowDialog(Application.ProductName, description, ref inputValue);
        }

        public static DialogResult ShowDialog(string caption, string description, ref string inputValue)
        {
            DialogResult res;

            using (InputBox frm = new InputBox(caption, description, inputValue))
            {
                res = frm.ShowDialog();
                if (res == DialogResult.OK)
                    inputValue = frm.txtInput.Text;
            }

            return res;
        }
}

und aufgerufen kann es dan z.b. so:

C#-Code:
private void button1_Click(object sender, EventArgs e)
{
            string value = "Ein Wert";
            if (InputBox.ShowDialog(ref value) == DialogResult.OK)
                MessageBox.Show(value);
}

so ähnlich wird es in Delphi oder auch VB gemacht. und ich finde es ist besser so für so eine einfache aufgabe.


Geschrieben von Xqgene am 04.08.2006 um 10:16:
 
ah ja...warum man KeyPreview = true braucht habe ich auch nicht ganz verstanden? geht auch ohne.


Geschrieben von herbivore am 04.08.2006 um 10:19:
 
Hallo Xqgene,

stimmt, die Verwendung von AcceptButton und CancelButton sollten reichen.

herbivore


Geschrieben von frisch am 04.08.2006 um 10:36:
 
Zitat:
Original von Rainbird

Zitat:
Original von frisch

C#-Code:
public frmInputBox(string paramBeschreibung, string paramFenstertitel, string paramStandartText)
    : this()
{
    this.Description = paramBeschreibung;
    this.WindowTitle = paramFenstertitel;
    txtInput.Text = paramStandartText;
}

Ich setze kein "param" vor meine Parameternamen. Hast Du das irgendwo im .NET Framework schon mal gesehen? Ich nämlich nicht.

Ich selbst benutze auch kein param. Meistens mache ich ein 'a' vor meinem Parameter. Ich habe jetzt lediglich param verwendet damit man leicht erkennen kann, was hier Parameter sind und was nicht.


Geschrieben von nic4x4 am 04.08.2006 um 16:30:
 
Zitat:
Original von Xqgene
ah ja...warum man KeyPreview = true braucht habe ich auch nicht ganz verstanden? geht auch ohne.

Bei mir ging das komischerweiße nicht immer.
Wenn ich der AcceptButton Eigenschaft einen Button zuweise, bekommt seine DialogResult Eigenschaft keinen Wert verwirrt

Das Tutorial werd ich noch überarbeiten.
Schaue mir die Beispiele an und erweiter/verbessere den Code.


Geschrieben von herbivore am 30.01.2007 um 09:03:
 
Hallo zusammen,

==>  InputBox

herbivore


Geschrieben von BerndFfm am 30.01.2007 um 14:21:
 
Ohne KeyPreview hängt es davon ab, welches Control den Focus hat.

Also besser einschalten.

Grüße Bernd


© Copyright 2003-2019 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 22.09.2019 03:48