myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
   » Plugin für Firefox
   » Plugin für IE
   » Gadget für Windows
» Regeln
» Wie poste ich richtig?
» Datenschutzerklärung
» wbb-FAQ

Mitglieder
» Liste / Suche
» Stadt / Anleitung dazu
» Wer ist wo online?

Angebote
» ASP.NET Webspace
» Bücher
» Zeitschriften
   » dot.net magazin
» Accessoires

Ressourcen
» .NET-Glossar
» guide to C#
» openbook: Visual C#
» openbook: OO
» .NET BlogBook
» MSDN Webcasts
» Search.Net

Team
» Kontakt
» Übersicht
» Wir über uns
» Bankverbindung
» Impressum

» Unsere MiniCity
MiniCity
» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Knowledge Base » Artikel » [Tutorial] InputBox selbermachen - Grundgerüst
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | An Freund senden | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

[Tutorial] InputBox selbermachen - Grundgerüst

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
nic4x4 nic4x4 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1983.jpg


Dabei seit: 27.06.2006
Beiträge: 191
Entwicklungsumgebung: VS 2005 SE
Herkunft: NRW


nic4x4 ist offline Füge nic4x4 Deiner Kontaktliste hinzu

[Tutorial] InputBox selbermachen - Grundgerüst

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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

Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nic4x4 am 03.08.2006 17:13.

03.08.2006 17:11 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
myCSharp.de
Moderationshinweis von herbivore (25.09.2012 15:52):

Für eine nicht-modale Alternative zur InputBox siehe  [Snippet] Nicht-modale Abfrage als Alternative für MessageBoxen (inbesondere folgenden Beitrag in  [Snippet] Nicht-modale Abfrage als Alternative für MessageBoxen).
 
frisch frisch ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1724.gif


Dabei seit: 18.08.2005
Beiträge: 2.083
Entwicklungsumgebung: VS C# 2005 Express
Herkunft: Coburg / Oberfranken


frisch ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
03.08.2006 17:21 Beiträge des Benutzers | zu Buddylist hinzufügen
webstarg webstarg ist männlich
myCSharp.de-Mitglied

Dabei seit: 21.07.2006
Beiträge: 558
Entwicklungsumgebung: Visual Studio 2008 Prof.
Herkunft: München, Deutschland


webstarg ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Daumen hoch
webstarg
03.08.2006 17:24 Beiträge des Benutzers | zu Buddylist hinzufügen
nic4x4 nic4x4 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1983.jpg


Dabei seit: 27.06.2006
Beiträge: 191
Entwicklungsumgebung: VS 2005 SE
Herkunft: NRW

Themenstarter Thema begonnen von nic4x4

nic4x4 ist offline Füge nic4x4 Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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
03.08.2006 17:33 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
frisch frisch ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1724.gif


Dabei seit: 18.08.2005
Beiträge: 2.083
Entwicklungsumgebung: VS C# 2005 Express
Herkunft: Coburg / Oberfranken


frisch ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
03.08.2006 17:36 Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.001
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
04.08.2006 09:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Rainbird Rainbird ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-2834.jpg


Dabei seit: 28.05.2005
Beiträge: 3.717
Entwicklungsumgebung: Visual Studio 2010
Herkunft: Mauer


Rainbird ist offline MSN-Passport-Profil von Rainbird anzeigen

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
04.08.2006 09:51 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
norman_timo norman_timo ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1775.jpeg


Dabei seit: 13.07.2004
Beiträge: 4.506
Entwicklungsumgebung: .NET 2.0/3.5 und VS2005/VS2008
Herkunft: Wald-Michelbach (Odw)


norman_timo ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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
04.08.2006 10:00 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Xqgene
myCSharp.de-Poweruser/ Experte

Dabei seit: 29.04.2004
Beiträge: 2.051


Xqgene ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

@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.
04.08.2006 10:09 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Xqgene
myCSharp.de-Poweruser/ Experte

Dabei seit: 29.04.2004
Beiträge: 2.051


Xqgene ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

ah ja...warum man KeyPreview = true braucht habe ich auch nicht ganz verstanden? geht auch ohne.
04.08.2006 10:16 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.001
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo Xqgene,

stimmt, die Verwendung von AcceptButton und CancelButton sollten reichen.

herbivore
04.08.2006 10:19 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
frisch frisch ist männlich
myCSharp.de-Poweruser/ Experte

images/avatars/avatar-1724.gif


Dabei seit: 18.08.2005
Beiträge: 2.083
Entwicklungsumgebung: VS C# 2005 Express
Herkunft: Coburg / Oberfranken


frisch ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
04.08.2006 10:36 Beiträge des Benutzers | zu Buddylist hinzufügen
nic4x4 nic4x4 ist männlich
myCSharp.de-Mitglied

images/avatars/avatar-1983.jpg


Dabei seit: 27.06.2006
Beiträge: 191
Entwicklungsumgebung: VS 2005 SE
Herkunft: NRW

Themenstarter Thema begonnen von nic4x4

nic4x4 ist offline Füge nic4x4 Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

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.
04.08.2006 16:30 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Zwischen diesen beiden Beiträgen liegen mehr als 5 Monate.
herbivore
myCSharp.de-Team (Admin)

images/avatars/avatar-2627.gif


Dabei seit: 11.01.2005
Beiträge: 49.001
Entwicklungsumgebung: csc/nmake (nothing is faster)
Herkunft: Berlin


herbivore ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo zusammen,

==>  InputBox

herbivore
30.01.2007 09:03 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
BerndFfm BerndFfm ist männlich
myCSharp.de-Team (Moderation)

images/avatars/avatar-3299.jpg


Dabei seit: 20.01.2006
Beiträge: 3.343
Entwicklungsumgebung: Visual Studio 2008
Herkunft: Frankfurt a.M.


BerndFfm ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Ohne KeyPreview hängt es davon ab, welches Control den Focus hat.

Also besser einschalten.

Grüße Bernd
30.01.2007 14:21 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als 8 Jahre.
Der letzte Beitrag ist älter als 7 Jahre.
Antwort erstellen


© Copyright 2003-2014 myCSharp.de-Team. Alle Rechte vorbehalten. 22.10.2014 06:47