none
Efecto extraño con MaskedTextBox y modificación del contenido

    Pregunta

  • Hola a todos,

    En todos los MaskedTextBox que utilizo como introductor de fecha, cuando verifico que la fecha no es válida y le devuelvo el foco al control, al introducir el primer carácter se desplaza la máscara permitiendo tener 3 cifras en el día, hasta que introduzco el segundo carácter, donde se sobreescribe la segunda cifra dejando el valor de la primera intacto.

    Ejemplo: fecha original 10/04/2017, modifico la fecha por 56/04/2017 y al validar da el error de fecha, cancelando la validación y llevando el foco al primer carácter, pero al pulsar la tecla "1" el Masked muestra 156/04/2017 y al pulsar el "0" el resultado es 50/04/2017, por lo que al validar muestra el error de nuevo

    El control está configurado como sobreescritura y las propiedades selectlenght y selectstart a "0", para sobreescribir el control desde el primer carácter.

    Lo curioso es, que si se selecciona todo el texto, al pulsar una tecla desaparece toda la máscara mostrando solo el valor de esa tecla, pero al pulsar la siguiente se recupera el contenido original.

    Esto solamente sucede cuando el control tiene el foco y se cancela su validación o el lostfocus/leave, ya que al recibir el foco desde otro control la introducción con sobreescritura funciona perfectamente.

    ¿Alguien tiene alguna idea de que le está pasando al MaskedTextBox? Esto mismo lo llevo usando en VB6 desde siempre y nunca me ha sucedido nada parecido.

    Un saludo, Paco.


    • Editado P.Lara lunes, 10 de abril de 2017 13:07 erratas en la escritura
    lunes, 10 de abril de 2017 13:04

Respuestas

  • Buenos días,

    Revisando de nuevo la documentación del control MaskedTextBox, he optado por sustituir el MessageBox que muestra el error por un ToolTip, ya que esto es lo que enseñan en todos los ejemplos. El resultado ha sido el correcto, por lo que parece ser que es alguna clase de incompatibilidad entre estos objetos.

    El ejemplo que he seguido es el que aparece en este enlace de la ayuda de msn

    https://msdn.microsoft.com/es-es/library/system.windows.forms.maskedtextbox.validatingtype(v=vs.100).aspx

    Un saludo, Paco

    • Marcado como respuesta P.Lara martes, 11 de abril de 2017 10:46
    martes, 11 de abril de 2017 10:45

Todas las respuestas

  • Revisa tus configuraciones regionales de Fecha, probablemente por allí sea el error.
    lunes, 10 de abril de 2017 14:33
  • Hola P.Lara

    Adjúntanos un poco de tu código para apoyarte

    Saludos.


    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    lunes, 10 de abril de 2017 14:39
  • Hola:

    Un consejo, para fechas usa el control llamado datetimepicker y te evitaras dolores de cabeza

    Un saludo desde Bilbo
    Carlos
    lunes, 10 de abril de 2017 15:54
  • Hola Carlos,

    Según mis pruebas (y no he encontrado información al respecto), el control datetimepicker no me permite introducir la fecha "a pelo". Es decir, en un masked introduces "1" "0" "0" "4" "2" "0" "1" "7" y el propio control va añadiendo las "/" de la máscara y posicionando el cursor en el digito siguiente.

    Con el datetimepicker hay que usar el ratón o las flechas de movimiento del cursor, y eso para mis usuarios no es cómodo porque siempre han trabajado así con las versiones de VB6. De hecho, como indico en mi consulta, funciona bien cuando el foco llega desde otro control.

    De todas maneras, si hay alguna forma de hacer que el control datetimepicker se comporte como el maskedttextbox estoy abierto a probarlo.

    Un saludo, Paco

    lunes, 10 de abril de 2017 16:31
  • Hola Brayan,

    No hay mucho código que mostrar:

        Private Sub mskFeFacturas_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles mskFeFacturas.GotFocus
            mskFeFacturas.SelectionStart = 0
            mskFeFacturas.SelectionLength = 0
        End Sub
    
        Private Sub mskFeFacturas_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles mskFeFacturas.KeyDown
            Select Case e.KeyValue
                Case Is = Keys.Return
                    If tbxSerieFraCan.Enabled = True Then
                        tbxSerieFraCan.Focus()
                    End if
                Case is = Keys.Escape
                    tbxCdDoc.Focus
            End Select
        End Sub
    
        Private Sub mskFeFacturas_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles mskFeFacturas.LostFocus
            If IsDate(mskFeFacturas.Text) = False Then
                MessageBox.Show("FECHA DE FACTURA NO VALIDA", "ERROR")
                mskFeFacturas.Focus()
            End If
        End Sub

    En el diseñador tengo configurado:

    CausesValidation = False

    Culture = es-Es

    InsertKeyMode = Overwrite

    Mask = 00/00/0000

    SkipLiterals = True

    TextMaskFormat = IncludeLiterals

    El resto por defecto.

    Un saludo, Paco

    • Editado P.Lara lunes, 10 de abril de 2017 16:47
    lunes, 10 de abril de 2017 16:38
  • Buenos días,

    Revisando de nuevo la documentación del control MaskedTextBox, he optado por sustituir el MessageBox que muestra el error por un ToolTip, ya que esto es lo que enseñan en todos los ejemplos. El resultado ha sido el correcto, por lo que parece ser que es alguna clase de incompatibilidad entre estos objetos.

    El ejemplo que he seguido es el que aparece en este enlace de la ayuda de msn

    https://msdn.microsoft.com/es-es/library/system.windows.forms.maskedtextbox.validatingtype(v=vs.100).aspx

    Un saludo, Paco

    • Marcado como respuesta P.Lara martes, 11 de abril de 2017 10:46
    martes, 11 de abril de 2017 10:45