Masked Texbox Datum automatisch ergänzen
-
Hallo,
die Textbox besitzt folgende Format "00,00,0000".
Ist es möglich die Eingabe automatisch so zu ergänzen, dass wenn nur 28 10 14 eingetragen wird, die Jahreszahl entsprechend auf 2014 ergänzt wird??
Einfach die Länge des Textes überprüfen?
Beim Leave Ereignis?Danke Euch!
-
Klar, kannst du das beim Ereignis maskedTextbox1_Leave machen. Du musst nur den
eingegebenen String text = maskedTextbox1.Text interpretieren, ggfs. ändern
und neu eintragen.Alternative: Verwende das Ereignis maskedTextbox1.TextChanged und trage "20" ein
sobald Tag und Monat eingetragen sind. Dann sieht der Anwender gleich die
automatische Ergänzung.
-
Mit TextChanged klingt gut.
Nur wie prüfe ich, ob bereits die ersten vier Stellen eingetragen sind?
Text.Length gibt mir immer die Gesamtlänge der Textbox zurück.
-
Etwa so:
private void textbox_TextChanged(object sender, EventArgs e) { string text; char c; int ic; text = maskedTextBox1.Text; c = text[4]; ic = c; if (ic != 32) { ..... } }
-
Es tut mir leid, irgendwie stehe ich total auf dem Schlauch:
string text; char c; int ic; text = tbDatum.Text; c = text[4]; ic = c; if (ic != 32) { if (!bDatum) { tbDatum.Text = tbDatum.Text + "20"; bDatum = true; } }
Allerdings wird bDatum nicht sofort auf true gesetzt, sondern if wird dreimal durchgeführt.
Somit steht in der Textbox dann xx.xx.2020
-
Overkill. Ist bereits alles fertig auf der Stange.
http://msdn.microsoft.com/en-us/library/system.datetime(v=vs.110).aspx
Beispielcode
-
@Prof84
Danke für den Link!Leider klappt es bei mir nicht. if wird bei mir nie true
private void textbox1_Leave(object sender, EventArgs e) { string text = "30.10.14"; string pattern = "MM.dd.yy"; string bla; DateTime parsedDate; if (DateTime.TryParseExact(text, pattern, null, DateTimeStyles.None, out parsedDate)) { bla = string.Format("Eingabe: {0} neu: {1:d}", text, parsedDate); MessageBox.Show(bla); } }
-
Die Aufgabe ist ein wenig trickreich:
1. Textergänzung mit AppendText
2. Cursorposition setzen erfordert eine Delegate-MethodeSo läuft es, wie ich mir das vorstelle:
private delegate void PositionCursorDelegate(int position); private void PositionCursor(int position) { maskedTextBox1.SelectionStart = position; } private void maskedTextbox1_TextChanged(object sender, EventArgs e) { // Mask = "00/00/0000" für Datum // " . ." Länge = 6 string text; int len, ic; text = maskedTextBox1.Text; ic = text[4]; len = text.Length; if ((len == 6) & (ic != 32)) { maskedTextBox1.AppendText("20"); this.BeginInvoke(new PositionCursorDelegate(PositionCursor), new object[] { 8 }); } }
Ich denke, das tut es wie gewünscht!
Oder auch mit Vorbesetzung bei form1_Load
private void maskedTextbox1_TextChanged(object sender, EventArgs e) { // Mask = "00/00/0000" für Datum string text; int len, ic; text = maskedTextBox1.Text; ic = text[4]; len = text.Length; if (ic != 32) { this.BeginInvoke(new PositionCursorDelegate(PositionCursor), new object[] { len }); } } private void form1_Load(object sender, EventArgs e) { maskedTextBox1.Text = " . .20"; this.BeginInvoke(new PositionCursorDelegate(PositionCursor), new object[] { 0 }); }
-
Perfekt - vielen vielen Dank!!!