Pregunta

Me he encontrado un error muy específico con el control DateTimePicker en Windows Forms. El control tiene un formato personalizado (MM-AAAA -> 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 utiliza el teclado para ajustar el mes de febrero, el control de arrojará una ArgumentOutOfRangeException. No hay una fecha como el 29-Feb-2009. Lo mismo sucederá en días como el 31, se mueve a un mes con sólo 30 días.

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

¿Cómo puede esto ser capturado excepción, cuando la entrada está sucediendo en la interfaz gráfica de usuario y no realmente en el código? Hemos tratado de atraparlo en caso 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 cambia automáticamente el día con el valor más alto para ese mes. O por lo menos si se pasa la excepción través de un evento.

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

¿Fue útil?

Solución

Si sólo desea el mes y el año, me parece que no se debe utilizar un DatePicker en el primer lugar ... ¿por qué presentar al usuario un control que incluye el día del mes cuando shouldn' t ser usarlo?

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

EDIT: Bueno, para responder a la cuestión específica de manejo de excepciones, se puede utilizar el caso Application.ThreadException , pero que iba a tratar de evitar tener que hacerlo si es posible.

Otros consejos

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

No hay manera que sólo se puede entrar en el mes / año sin el día. Si no se especifica explícitamente ningún día se utiliza el día actual. DateTimePicker necesita todos los datos -. No importa si se esconde detrás de la máscara

La única manera de hacer que el DateTimePicker hacer esto es, respuesta típica .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 se establece en (el formato de tarjeta de crédito) '00 / 0000' y luego una validación de la entrada

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top