2009-09-29 15 views
5

Ich habe einen sehr spezifischen Fehler mit dem DateTimePicker-Steuerelement in Windows Forms festgestellt. Das Steuerelement hat ein benutzerdefiniertes Format (MM-JJJJ -> 01/2010) - den Monat/das Jahr einer Kreditkarte. Heute ist der 29. September. Wenn ein Benutzer das Steuerelement auswählt und mithilfe der Tastatur den Monat auf Februar festlegt, löst das Steuerelement eine ArgumentOutOfRangeException aus. Es gibt kein solches Datum wie 29-Feb-2009. Dies wird auch an Tagen wie dem 31. geschehen, die zu einem Monat mit nur 30 Tagen wechseln.Wie kann ich mit einem Windows Forms datetimepicker ArgumentOutOfRangeException umgehen?

Es wäre einfach genug, dies zu handhaben, indem Sie den Tag auf "01" stellen, aber ein Benutzer kann auf den Kalender klicken, um manuell den 30. auszuwählen, und dann die Tastatur verwenden, um Februar auszuwählen.

Wie kann diese Ausnahme abgefangen werden, wenn die Eingabe auf der GUI geschieht und nicht wirklich im Code? Wir haben versucht, es im TextChanged-Ereignis abzufangen, aber das ist bereits zu spät. Die Ausnahme wurde bereits ausgelöst.

Gibt es eine Möglichkeit, diesen Fall zu behandeln? Es wäre schön, wenn das Steuerelement den Tag automatisch auf den höchsten Wert für diesen Monat ändern würde. Oder zumindest, wenn es die Ausnahme durch ein Ereignis passiert hat.

(Ich bin mir bewusst, dass wir das KeyPressed-Ereignis abfangen und den Tag jedes Mal auf 01 setzen können, aber das fühlt sich "hacky" an).

Antwort

5

Wenn Sie nur den Monat und das Jahr möchten, scheint es mir, dass Sie nicht einen DatePicker an erster Stelle verwenden sollten ... warum präsentieren Sie dem Benutzer ein Steuerelement, das den Tag des Monats enthält, wenn sie sollten benutze es nicht?

Ich würde vorschlagen, dass Sie entweder zwei Dropdown-Listen verwenden, eine für das Jahr und eine für den Monat. Das wird Benutzern von fast jeder Online-Zahlungsseite bekannt sein und das Problem vermeiden.

EDIT: Okay, um die spezifische Frage der Behandlung von Ausnahmen zu beantworten, können Sie das Ereignis Application.ThreadException verwenden, aber ich würde versuchen, dies zu vermeiden, wenn Sie können.

+0

Ich habe gerade getestet, ob es passiert, wenn der Tag dem Benutzer angezeigt wird, und es nicht tut. Du hast also Recht, die falsche Kontrolle wird benutzt. Aber der Zweck meiner Frage war, herauszufinden, ob es möglich war, Ausnahmen zu behandeln, die auf ähnliche Weise auftraten. Wenn eine Ausnahme von der Benutzeroberflächeninteraktion eines Steuerelements generiert wird. –

1

Könnten Sie setzen den ShowUpDown Eigenschaft des Datetimepicker zu wahren, so dass die Steuerung eher einen Spinner wird als ein Kalender-Dropdown-?

+0

Dies bedeutet natürlich, dass Sie den Tag immer noch auf 1 setzen müssen, bevor Sie ihn dem Benutzer zeigen. –

0

Es gibt keine Möglichkeit, dass Sie nur Monat/Jahr ohne den Tag eingeben können. Wenn kein Tag explizit angegeben ist, wird der aktuelle Tag verwendet. Der DateTimePicker benötigt alle Daten - es spielt keine Rolle, ob Sie ihn hinter der Maske verstecken.

Der einzige Weg, um die Datetime tut dies, typische .NET Antwort, um Ihre eigene Klasse zu schreiben, die von DateTimePicker ableitet und haben ohne Tage eine individuelle Art und Weise Eingang der Handhabung. Jedenfalls werden Sie nicht ohne die Einstellung des Tages ...

Wenn ich kann: Ich schlage eine MaskedTextBox mit einer Maske auf '00/0000 '(das Kreditkartenformat) und dann eine Validierung der Eingabe.

Verwandte Themen