Laden...

MaskedTextBox leeres Datum

Letzter Beitrag vor 9 Jahren 16 Posts 5.553 Views
MaskedTextBox leeres Datum

Hallo zusammen,
ich habe eine MaskedTextBox mit folgenden (nicht-standard) Eigenschaften:
Mask = "00/00/0000"
TextMaskFormat = IncludeLiterals
PasswordChar = " "
PromptChar = " "

TypeValidationCompleted habe ich wie folgt belegt:

private void datumsfelder_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
        {
             if (((System.Windows.Forms.MaskedTextBox)(sender)).MaskCompleted)
            {
                if (e.IsValidInput)
                {
                }
                else
                {
                    e.Cancel = true;
                }
            }
        }

HIntergrund: ich möchte das beim Verlassen des Feldes das Datum auf Gültigkeit überprüft wird, wenn nicht, soll der Focus auf dem Feld bleiben; ist das Datumsfeld jedoch leer, so soll der Focus auch auf das nächste Feld gehen.
Aber genau das passiert nicht 🙄

Das gebundene Feld lässt aber NUll-Values zu ...

Was muß ich tun, damit die MaskedTextBox bei einem leeren Datum verlassen werden kann?

MfG ChrisProg

Hallo herbivore,

ja, das hatte ich auch schon gefunden u. meinen Code entsprechend von


 if (((System.Windows.Forms.Control)(sender)).Text.Replace(":", "").Replace(".", "").Trim() != "")

in

if (((System.Windows.Forms.MaskedTextBox)(sender)).MaskCompleted)

angepasst...

Trotzdem bleibt der Focus auf dem Feld - ich kann es erst wieder verlassen, wenn ich ein gültiges Datum eingetragen habe ...

Dabei ist es egal, ob ich mit Tab , Pfeil oder Maus versuche das Feld zu verlassen .

Wie gesagt der Code springt (ganz so, wie er soll) aus der Prozedur heraus, aber der Focus bleibt 8o

MfG ChrisProg

Hallo ChrisProg,

required vs optional

"00/00/0000" vs "##/##/####"

MaskFull vs MaskCompleted

herbivore

Hallo herbivore,

es ist egal, ob ich
a) Mask = "00/00/0000" und die Abfrage nach MaskCompleted
oder
b) Mask = "##/##/####" und dei Abfrage nach MaskFull
mache, der Code funktioniert ja - die Schleife wird jeweils ohne die Überprüfung von

if (e.IsValidInput)...

korrekt durchgeführt.

Aber: trotzdem behält dieses Feld den Focus u. ich weiss nicht warum

lt. Microsoft

Wenn die Cancel-Eigenschaft im TypeValidationCompleted-Ereignishandler auf true festgelegt ist, wird das Ereignis abgebrochen, und das MaskedTextBox-Steuerelement behält den Fokus, bis ein nachfolgendes Validating-Ereignis seine Version der CancelEventArgs.Cancel-Eigenschaft auf false zurücksetzt.

e.Cancel ist definitiv auf false u. trotzdem bleibt der Focus 🤔

Irgendwie habe ich da was wohl nicht richtig verstanden, oder ???

MfG ChrisProg

Hallo ChrisProg,

du selbst schreibst doch die Bedingung, wann wie Validierung bestanden und wann abgebrochen werden soll. Entsprechend musst du sie so schreiben, dass sowohl vollständige Datumseingaben als auch ein komplett leeres Datum als gültig erkannt werden.

Damit beides erlaubt ist, musst du "##/##/####" verwenden. Wenn du jetzt aber nur auf MaskFull abfragst, dann "erzwingst" du ja wieder, dass alles ausgefüllt ist.

"##/##/####" + MaskFull ist also nur die eine valide Möglichkeit. Denn Fall leer musst du zusätzlich abfragen/berücksichtigen.

Also mit der Doku, den Hinweisen und dem Debugger, der dir zeigt, in welchen Situationen welche Properties welchen Wert haben, sollte die Aufgabe nun wirklich keine Hürde sein.

herbivore

Hallo herbivore,

irgendwie sehe ich anscheinend den Wald vor lauter Bäumen nicht ...

Unabhängig vom Code sollte das Feld doch bei e.Cancel = false den Focus verlieren, oder nicht ...

e.IsValidInput ist da zwar false, aber die Eigenschaft ist ja schreibgeschützt!

Und den Code muß ich doch im TypeValidationCompleted abfangen, es wird vor Validating ausgeführt.

Oder habe ich was an der Ablaufreihenfolge nicht verstanden?

MfG ChrisProg

Und wieso setzt Du dann nirgends e.Cancel auf false?
Mal per Debugger geprüft, ob es nicht von Anfang an auf true steht?

Hallo Abt,

natürlich habe ich vorher (bevor ich diesen Threat erstellt habe) mit Hilfe des Debuggers die Werte überprüft ...

e.Cancel steht definitv auf false !!!

Auch ein zusätzliches Setzten "e.Cancel = false" hat an dem Verhalten nichts geändert...

Das ist ja gerade, was ich nicht verstehe: lt. Microsoft sollte nur bei e.Cancel = true der Focus auf der MaskedTextBox bleiben, aber er ist false !!!
Auch im nachfolgend ausgeführten Validating ist e.Cancel lt. Debugger false

MfG ChrisProg

MaskedTextBox.Eigenschaften 2

MaskedTextBox.Eigenschaften 3

TypeValidationEventAgrs

(Ich wollte alles per Link laden, aber bekam die Fehlermeldung das ich es so machen sollte ...)

Hallo zusammen,

ich habe den Fehler gefunden (liegt wie immer zwischen den Kopfhörnern 🙁 )

Ich bin einfach noch zu sehr durch FoxPro geprägt / verwöhnt X(

Die Bindingsource kann zwar Null-Werte aber ein leeres Feld wird halt nicht als Null interpretiert 😜

Man kann beim setzen der BindingSource festlegen was ein "Null-Value" ist:

x_control.DataBindings.Add(new System.Windows.Forms.Binding("Text", <bs>, <Feldname>, true, DataSourceUpdateMode.Never, "  .  .    "));

aber das ist ja nicht universell ...

Jetzt meine Frage dazu:
natürlich weiß ich welches Feld dahinter liegt, da ich aber die Prozedur als Klasse benutzen will - kann man über die Eigenschaften die BindingSource der entsprechenden MaskedTextBox herausfinden, oder ist es gar möglich "Null" an die BindingSource durchzugeben ???

MfG ChrisProg

Hallo herbivore

siehe
>

eine Sache verstehe ich nach all meinen Tests jetzt aber nicht:
verwende ich Mask = "00/00/0000" dann ist MaskCompleted immer false außer wenn ein korrektes Datum eingeben wurde;
verwende ich Mask = "##/##/####" dann ist MaskCompleted immer true, egal, ob das Feld leer, das Datum gültig, ungültig oder unvollständig ist.

Somit ist diese Eigenschaft zur Überprüfung, ob das Feld leer ist überhaupt nicht zu gebrauchen X(
Lt. Fabian soll man ja

für so eine Abfrage bitte nicht die Maske direkt in der Abfrage verwenden

die Maske nicht direkt abfragen [also nicht so : (--> das funktioniert aber!)]


 private void datumsfelder_TypeValidationCompleted(object sender, TypeValidationEventArgs e)
{
     if (!e.IsValidInput && ((System.Windows.Forms.Control)(sender)).Text.Replace(":", "").Replace(".", "").Trim() != "")
     {
         e.Cancel = true;
     }
}

Wie soll man es vor dem o.g. Hintergrund denn dann machen ???

MfG ChrisProg

Hallo ChrisProg,

da in "##/##/####" jedes Zeichen für sich optional ist, also ausfüllt sein kann oder eben nicht, ist MaskCompleted in jedem Fall true, korrekt.

Hast du schon mal "99/99/9999" probiert? Wie sieht der Text dann aus, wenn nichts eingegeben wurde? Ist er dann komplett leer oder sind noch die Trennzeichen drin?

Wenn nicht, könntest du den Text direkt auf leer abfragen. Ansonsten musst du wohl auf den Text abfragen, der enthalten ist, wenn das Feld leer ist, ob das nun besonders schön ist oder nicht.

herbivore

Hallo herbivore,

es sind noch Trennzeichen drin, also werde ich bis auf weiteres den Text abfragen 🙁

Weißt Du denn noch eine andere Möglichkeit der zu Grunde liegenden BindingSource "Null" zuzuweisen, außer direkt beim Binding an die MaskedTextBox ???

MfG ChrisProg