Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

In TextBox nur bestimmte Zeichen zulassen

659 views
Skip to first unread message

Peter Cerveny

unread,
Dec 27, 2004, 5:23:46 PM12/27/04
to
An alle helfenden NG-User

Habe jetzt schon eine "tb.TextChanged += new EventHandler
(OnTextBoxChanged)" plus "void OnTextBoxChanged" definiert aber das Löschen
von einzelnen Zeichen mit "tb.Text.Remove" in der Schleife funktioniert
nicht so richtig.

Möchte nur "A-Z und Ä,Ü,Ö,ß zulassen)

dank im vorhinein

Peter


Arne Janning

unread,
Dec 27, 2004, 6:06:02 PM12/27/04
to
Hallo Peter!

"Peter Cerveny" schrieb


> Habe jetzt schon eine "tb.TextChanged += new EventHandler
> (OnTextBoxChanged)" plus "void OnTextBoxChanged" definiert aber das
Löschen
> von einzelnen Zeichen mit "tb.Text.Remove" in der Schleife funktioniert
> nicht so richtig.
>
> Möchte nur "A-Z und Ä,Ü,Ö,ß zulassen)

Ich habe vielleicht nicht ganz begriffen, was Du willst, aber der übliche
Weg ist doch, im KeyPress-Event die Eingaben zu prüfen und falsche Eingaben
zu unterdrücken:

using System.Text.RegularExpressions;

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (!Regex.IsMatch(e.KeyChar.ToString(), "[a-zA-ZÄÖÜß]"))
{
e.Handled = true;
}
}

Es spricht auch nichts dagegen, bei falschen Eingaben MessageBoxen,
Hinweise, etc. anzuzeigen.

Gruß

Arne Janning


Frank Dzaebel

unread,
Dec 27, 2004, 6:21:04 PM12/27/04
to
Hallo Peter,

> Möchte nur "A-Z und Ä,Ü,Ö,ß zulassen)

private void textBox1_TextChanged(object sender, System.EventArgs e)
{ bool ok= !Regex.Match(textBox1.Text, "[^A-ZÄÜÖß]").Success; }

ciao Frank
--
Dipl.Inf. Frank Dzaebel [MCP C#]

Herfried K. Wagner [MVP]

unread,
Dec 27, 2004, 6:25:05 PM12/27/04
to
Hallo Arne!

"Arne Janning" <spam.me-here...@gmx.de> schrieb:


> Es spricht auch nichts dagegen, bei falschen Eingaben MessageBoxen,
> Hinweise, etc. anzuzeigen.

Ich persönlich bevorzuge die Validierung in entsprechenden Ereignissen
('Validating') und nicht direkt bei der Eingabe, damit ein
"in-place"-Bearbeiten des Eingegebenen seitens des Benutzers ermöglicht
wird. Schlägt die Validierung fehl, setze ich einen ErrorProvider mit
Informationen zum Grund für die fehlerhafte Eingabe sowie Hinweisen zur
Richtigstellung, falls der Grund der Invalidität bestimmt werden kann.

--
M S Herfried K. Wagner
M V P <URL:http://dotnet.mvps.org/>
V B <URL:http://dotnet.mvps.org/dotnet/faqs/>

Frank Dzaebel

unread,
Dec 27, 2004, 6:31:02 PM12/27/04
to
Hallo Arne,

> private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
> { if (!Regex.IsMatch(e.KeyChar.ToString(), "[a-zA-ZÄÖÜß]"))
> e.Handled = true;
> }

ja richtig, bis auf die a-z, OP wollte nur Großbuchstaben.

Arne Janning

unread,
Dec 27, 2004, 6:34:55 PM12/27/04
to
Hallo Herfried!

"Herfried K. Wagner [MVP]" schrieb


> Ich persönlich bevorzuge die Validierung in entsprechenden Ereignissen
> ('Validating') und nicht direkt bei der Eingabe, damit ein
> "in-place"-Bearbeiten des Eingegebenen seitens des Benutzers ermöglicht
> wird. Schlägt die Validierung fehl, setze ich einen ErrorProvider mit
> Informationen zum Grund für die fehlerhafte Eingabe sowie Hinweisen zur
> Richtigstellung, falls der Grund der Invalidität bestimmt werden kann.

Full ACK, gar keine Frage. Der OP hat nur den Weg mit TextBoxChanged
vorgegeben, womit er offensichtlich Eingaben während der Eingabe testen
will. Wenn ich schon während der Eingabe prüfen will (oder muss), dann mache
ich es eben so, wie ich gepostet habe.

Gruß

Arne Janning


Herfried K. Wagner [MVP]

unread,
Dec 27, 2004, 6:43:35 PM12/27/04
to
Hallo Arne!

"Arne Janning" <spam.me-here...@gmx.de> schrieb:
>> [Prüfung des Inhalts bei Validierung + ErrorProvider]


>
> Full ACK, gar keine Frage. Der OP hat nur den Weg mit TextBoxChanged
> vorgegeben, womit er offensichtlich Eingaben während der Eingabe testen
> will. Wenn ich schon während der Eingabe prüfen will (oder muss), dann
> mache
> ich es eben so, wie ich gepostet habe.

Genau -- dann würde ich es auch so oder zumindest so ähnlich machen.

Arne Janning

unread,
Dec 27, 2004, 6:59:24 PM12/27/04
to
Hallo Frank!

"Frank Dzaebel" schrieb


> ja richtig, bis auf die a-z, OP wollte nur Großbuchstaben.

Ich habe den Beitrag des OP durchaus gesehen und mir darüber Gedanken
gemacht.

Die Schwierigkeit in dieser NG ist einzuschätzen, auf welchem Stand der OP
ist. Jemand, der in der Lage ist [a-zA-Z] von [A-Z] zu unterscheiden und mit
Regex vertraut ist, wird in der Regel nicht die Frage stellen, die der OP
nun mal gestellt hat. Das war zumindest meine Überlegung.

Also habe ich "A-Z" nicht als Regex-Pattern interpretiert, sondern als
"normale Buchstaben aus dem Alphabet", habe aber mein Regex-Pattern bewusst
so gestaltet, dass es für dem OP leicht zu ändern ist. Ich hätte ja sonst
auch einfach Regex-Symbole benutzen können.

Gelegentlich liegt man mit den Annahmen über die Kenntnisse des OP auch
falsch. Du magst andere Annahmen zugrunde gelegt haben. Damit lebe ich dann
einfach und

grüße Dich freundschaftlich in Bremen

Arne Janning


Michael v. Fondern

unread,
Dec 28, 2004, 1:21:41 AM12/28/04
to
Peter Cerveny schrieb:

Das geht so:

- benutzerdefiniertes Control (Ableitung von
System.Windows.Forms.TextBox) anlegen

- KeyPress-Event-Handler anlegen, z.B. in InitializeComponent
this.KeyPress += new
System.Windows.Forms.KeyPressEventHandler(this.OnKeyPress);

- innerhalb des Event-Handlers:

void OnKeyPress(object sender, KeyPressEventArgs e)
{
// e.KeyChar gibt das gedrückte Zeichen an
// e.Handled = true setzen und return, wenn ein Zeichen unterdrückt
werden soll
// e.Handled = false setzen und return, falls die Eingabe vom
System behandelt werden soll
}

Ansonsten kannst du auch mal hier reinschauen:
http://www.akadia.com/services/dotnet_user_controls.html

(im Beispiel dort wird zwar mit nicht so geschicktem 'overloading' statt
Event-Handling gearbeitet, aber das Prinzip sollte klar werden).

Grüße

- Michael -


Frank Dzaebel

unread,
Dec 28, 2004, 3:21:02 AM12/28/04
to
Hallo Michael,

> Das geht so: - benutzerdefiniertes Control .... - KeyPress-Event anlegen...

Da braucht man aber nicht extra ein benutzerdefiniertes Control.
Schau mal in Arnes Posting.

Herfried K. Wagner [MVP]

unread,
Dec 28, 2004, 5:01:09 AM12/28/04
to
Hallo Frank!

"Frank Dzaebel" <PostAddFranksSeitePunktDe> schrieb:


>> Das geht so: - benutzerdefiniertes Control .... - KeyPress-Event
>> anlegen...
>
> Da braucht man aber nicht extra ein benutzerdefiniertes Control.
> Schau mal in Arnes Posting.

Wenn man das Steuerelement wiederverwenden will, kann man entweder von
'TextBox' ableiten und die Klasse entsprechend erweitern, oder man schreibt
eine Extender-Komponente. Benutzerdefinierte Steuerelemente im Sinne von
UserControls sind etwas anderes.

Frank Dzaebel

unread,
Dec 28, 2004, 7:41:04 AM12/28/04
to
Hallo Herfried,

> Wenn man das Steuerelement wiederverwenden will, kann man entweder von
> 'TextBox' ableiten und die Klasse entsprechend erweitern, oder man schreibt
> eine Extender-Komponente. Benutzerdefinierte Steuerelemente im Sinne von
> UserControls sind etwas anderes.

Allgemein kann man das natürlich alles so machen.
Frage war aber vom OP nicht in Richtung Wiederverwendbarkeit gestellt.
Selbst wenn, und man *ohne* benutzerdefiniertes Control arbeitet,
ist das Zufügen des Events an den Handler für jede Textbox kein
Aufwand. Man markiert einfach alle Textboxen, geht auf den gelben Blitz
und fügt den Handler zu. Sicher bei sehr vielen TextBoxen würde
ich natürlich irgendwann auch ein Control nehmen.
Für die Aufgabe des OP ist das Code-Overhead.

Herfried K. Wagner [MVP]

unread,
Dec 28, 2004, 7:57:57 AM12/28/04
to
Hallo Frank!

"Frank Dzaebel" <PostAddFranksSeitePunktDe> schrieb:


> Frage war aber vom OP nicht in Richtung Wiederverwendbarkeit gestellt.
> Selbst wenn, und man *ohne* benutzerdefiniertes Control arbeitet,
> ist das Zufügen des Events an den Handler für jede Textbox kein
> Aufwand. Man markiert einfach alle Textboxen, geht auf den gelben Blitz
> und fügt den Handler zu. Sicher bei sehr vielen TextBoxen würde
> ich natürlich irgendwann auch ein Control nehmen.
> Für die Aufgabe des OP ist das Code-Overhead.

Bei einem Formular und einem einzigen Projekt hast du sicher recht.

Peter Cerveny

unread,
Dec 28, 2004, 3:42:56 PM12/28/04
to
Liebe NG-User

Vielen Dank für die prompte Hilfe, dass mit dem OnKeyPress hat funktioniert.

Ich habe es jetzt so gemacht, das funktioniert.

tb.KeyPress += new KeyPressEventHandler (OnKeyPressed);

void OnKeyPressed (object sender, KeyPressEventArgs kpea)
{
int ch = Convert.ToInt32 (kpea.KeyChar);

Console.WriteLine ("KeyChar = {0} / ch = {1}", kpea.KeyChar, ch);

if (((ch > 64) && // grösser als "@" also ab "A"
(ch < 91)) || // kleiner als "[" also bis "Z"
((ch > 96) && // grösser als "`" also ab "a"
(ch < 123)) || // kleiner als "{" also bis "z"
(ch == 196) || // das grosse "Ä"
(ch == 214) || // das grosse "Ö"
(ch == 220) || // das grosse "Ü"
(ch == 223) || // das "ß"
(ch == 228) || // das kleine "ä"
(ch == 246) || // das kleine "ö"
(ch == 252)) // das kleine "ü"
{
kpea.Handled = false;
return;
}
else
{
kpea.Handled = true;
return;
}
}

Vielen Dank nochmal für eure Tipps, wie immer "bei euch wird mir geholfen".

Gruss Peter


"Peter Cerveny" <peter....@chello.at> schrieb im Newsbeitrag
news:SX%zd.9738$BO5....@news.chello.at...

0 new messages