2009-09-29 8 views
5

He encontrado un error muy específico con el control DateTimePicker en Windows Forms. El control tiene un formato personalizado (MM-YYYY -> 01/2010) - el mes/año de una tarjeta de crédito. Hoy es el 29 de septiembre. Si un usuario selecciona el control y usa el teclado para configurar el mes en febrero, el control lanzará una ArgumentOutOfRangeException. No hay una fecha tal como el 29 de febrero de 2009. Esto también ocurrirá en días como el día 31, moviéndose a un mes con solo 30 días.¿Cómo puedo manejar un formulario de Windows datetimepicker ArgumentOutOfRangeException?

Sería fácil manejar esto estableciendo el día en '01', sin embargo, un usuario puede hacer clic en el calendario para seleccionar manualmente el 30 y luego usar el teclado para seleccionar febrero.

¿Cómo se puede capturar esta excepción cuando la entrada está ocurriendo en la GUI y no realmente en el código? Hemos tratado de atraparlo en el evento TextChanged, pero eso ya es demasiado tarde. La excepción ya está lanzada.

¿Hay alguna manera de manejar este caso? Sería bueno si el control cambiara automáticamente el día al valor más alto para ese mes. O al menos si pasó la excepción a través de un evento.

(Soy consciente de que podríamos atrapar el evento KeyPressed y establecer el día en 01 cada vez, pero esto se siente 'hacky').

Respuesta

5

Si solo quieres el mes y el año, me parece que no deberías usar un DatePicker en primer lugar ... ¿por qué presentar al usuario un control que incluya el día del mes cuando no deberían? ¿Lo estarás usando?

Le sugiero que use dos menús desplegables, uno para el año y otro para el mes. Eso será familiar para los usuarios de casi todas las páginas de pago en línea y evitará el problema.

EDITAR: Bien, para responder a la pregunta específica de manejo de excepciones, puede utilizar el evento Application.ThreadException, pero trataría de evitar hacerlo si puede.

+0

Acabo de probar si ocurre cuando el día se muestra al usuario, y no es así. Así que tienes razón, el control equivocado ES en uso. Pero el propósito de hacer la pregunta era averiguar si era posible manejar excepciones que ocurrieron de manera similar. Si se genera una excepción de la interacción UI de un control. –

1

Podría establecer la propiedad del DateTimePicker ShowUpDown a true para que el control se convierte en una ruleta en lugar de un calendario desplegable?

+0

Esto, por supuesto, significa que todavía tiene que establecer el día en 1 antes de mostrárselo al usuario. –

0

No hay forma de que solo pueda ingresar mes/año sin el día. Si no se especifica ningún día explícitamente, se usa el día actual. DateTimePicker necesita todos los datos; no importa si lo oculta detrás de la máscara.

La única manera de hacer que el DateTimePicker hacer esto es, típica respuesta .NET, para escribir su propia clase que deriva de DateTimePicker y tiene una forma personalizada de controlar las entradas y sin días. De todos modos, no se saldrá sin ajustar el día ...

Si se me permite: Puedo sugerir un MaskedTextBox con una máscara para establecer '00/0000' (el formato de tarjeta de crédito) y luego una validación de entrada.

Cuestiones relacionadas