Pregunta

Me gustaría ser capaz de reemplazar el comportamiento predeterminado para posicionar el cursor en una máscara de cuadro de texto.

El valor predeterminado es colocar el cursor donde el ratón se hace clic, el enmascarado de cuadro de texto contiene caracteres debido a la máscara.

Yo sé que usted puede ocultar el símbolo de intercalación como se ha mencionado en este post, hay algo similar para colocar el cursor al principio del cuadro de texto cuando el control recibe el foco.

¿Fue útil?

Solución

Esto debe hacer el truco:

    private void maskedTextBox1_Enter(object sender, EventArgs e)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            maskedTextBox1.Select(0, 0);
        });         
    }

Otros consejos

Para mejorar Abbas solución de trabajo, intente esto:

private void ueTxtAny_Enter(object sender, EventArgs e)
{
    //This method will prevent the cursor from being positioned in the middle 
    //of a textbox when the user clicks in it.
    MaskedTextBox textBox = sender as MaskedTextBox;

    if (textBox != null)
    {
        this.BeginInvoke((MethodInvoker)delegate()
        {
            int pos = textBox.SelectionStart;

            if (pos > textBox.Text.Length)
                pos = textBox.Text.Length;

            textBox.Select(pos, 0);
        });
    }
}

Este controlador de eventos puede ser re-utilizado con múltiples cajas, y no quita la capacidad del usuario para colocar el cursor en el medio de entrada de datos (i.e no se fuerza el cursor en zeroeth posición si la casilla no está vacío).

Me parece que esto es más de cerca la imitación de un cuadro de texto estándar.Sólo glitch restantes (que yo vea) es que después de 'Enter' caso, el usuario es capaz de seleccionar el resto de la (vacío) máscara de preguntar si xe mantiene pulsado el botón del ratón y arrastra hasta el final.

Que es una gran mejora sobre el comportamiento por defecto de MaskedTextBoxes.Gracias!

Hice un par de cambios para Ishmaeel excelente solución.Yo prefiero llamar a BeginInvoke sólo si el cursor necesita ser movido.Yo también llamar a un método de diversos controladores de eventos, por lo que el parámetro de entrada es el activo MaskedTextBox.

private void    maskedTextBoxGPS_Click( object sender, EventArgs e )
{
    PositionCursorInMaskedTextBox( maskedTextBoxGPS );
}


private void    PositionCursorInMaskedTextBox( MaskedTextBox mtb )
{
  if (mtb == null)    return;

  int pos = mtb.SelectionStart;

  if (pos > mtb.Text.Length)
    this.BeginInvoke( (MethodInvoker)delegate()  { mtb.Select( mtb.Text.Length, 0 ); });
}

Respuesta parcial:usted puede colocar el cursor mediante la asignación de un 0-selección de longitud para el control en el evento Click, por ejemplo:

MaskedTextBox1.Select(5, 0)

...establece el carácter de intercalación en la 5ª posición de carácter en el cuadro de texto.

La razón de esta respuesta es sólo parcial, es porque no puedo pensar en general, una manera segura de determinar la posición en la que el símbolo de intercalación debe se coloca en un clic.Esto puede ser posible que algunas de las máscaras, pero en algunos casos (por ejemplo,el número de teléfono de US máscara), realmente no puedo pensar de una manera fácil separar la máscara y el símbolo de caracteres de la entrada del usuario...

//not the prettiest, but it gets to the first non-masked area when a user mounse-clicks into the control
private void txtAccount_MouseUp(object sender, MouseEventArgs e)
{
  if (txtAccount.SelectionStart > txtAccount.Text.Length)
    txtAccount.Select(txtAccount.Text.Length, 0);
}

Esta solución funciona para mí.Darle una oportunidad, por favor.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

 maskedTextBox1.Select(maskedTextBox1.Text.Length, 0);
}

Yo tengo la mía para que funcionen con el evento Click....no Invocar era necesario.

 private void maskedTextBox1_Click(object sender, EventArgs e)
{
     maskedTextBox1.Select(0, 0);              
}

Esta solución utiliza el método Click de la MaskedTextBox como Gman Cornflake utilizado;sin embargo, he encontrado que es necesario para permitir que el usuario haga clic en el interior de la MaskedTextBox una vez que contenían datos y el cursor permanezca donde está.

El ejemplo a continuación desactiva los mensajes y literales y evalúa la longitud de los datos en el MaskedTextBox y si es igual a 0 se pone el cursor en la posición inicial;de lo contrario, simplemente se omite el código que pone el cursor en la posición de partida.

El código está escrito en VB.NET 2017.Espero que esto ayude!

Private Sub MaskedTextBox1_Click(sender As Object, e As EventArgs) Handles MaskedTextBox1.Click
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.ExcludePromptAndLiterals
    If Me.MaskedTextBox1.Text.Length = 0 Then
        MaskedTextBox1.Select(0, 0)
    End If
    Me.MaskedTextBox1.TextMaskFormat = MaskFormat.IncludePromptAndLiterals
End Sub
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top