2008-09-23 12 views
19

Me gustaría poder anular el comportamiento predeterminado para posicionar el símbolo de intercalación en un cuadro de texto enmascarado.Posicionar el símbolo de intercalación en MaskedTextbox

El valor por defecto es colocar el cursor donde se hizo clic en el ratón, el cuadro de texto enmascarado ya contiene caracteres debido a la máscara.

Sé que puede ocultar el símbolo de intercalación como se menciona en este post, ¿hay algo similar para posicionar el símbolo de intercalación al principio del cuadro de texto cuando el control obtiene el foco.

Respuesta

26

Esto debe hacer el truco:

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

Ahh, por lo que debe utilizar BeginInvoke! Intenté esto sin hacerlo y terminé sin ver ningún cambio. +1 – Jeremy

+0

¿Por qué necesita usar BeginInvoke? – Vaccano

+0

@vaccano - me funciona sin el BeginInvoke –

3

respuesta parcial: se puede posicionar el cursor mediante la asignación de una selección 0 de longitud con el control en caso MouseClick, por ejemplo:

MaskedTextBox1.Select(5, 0) 

. ... establecerá el cursor en la 5ª posición del carácter en el cuadro de texto.

El motivo por el que esta respuesta es solo parcial, se debe a que no se me ocurre una forma generalmente confiable de determinar la posición en la que el cursor debe colocarse en con un clic. Esto puede ser posible que algunas máscaras, pero en algunos casos comunes (por ejemplo, la máscara de números de teléfono de EE.UU.), que realmente no puedo pensar en una manera fácil de separar la máscara y caracteres del sistema desde la entrada del usuario real ...

9

para mejorar solución de trabajo de Abbas, 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 se pueden volver a utilizar con múltiples cajas, y que no le quita la capacidad del usuario para posicionar el cursor en el medio de los datos introducidos (es decir, no fuerza al cursor a la posición cero cuando la caja no está vacía).

Me parece que imita más de cerca un cuadro de texto estándar. El único problema restante (que puedo ver) es que después del evento 'Enter', el usuario aún puede seleccionar el resto de la solicitud de máscara (vacía) si xe mantiene presionado el mouse y arrastra hasta el final.

+0

Gracias por el pequeño ajuste. Justo lo que necesitaba. –

+0

Puede atenderlo con el mismo código al usarlo para las funciones Entrar y Hacer clic para Maskedtextbox :) – Mobin

6

Eso es una gran mejora sobre el comportamiento predeterminado de MaskedTextBoxes. ¡Gracias!

Hice algunos cambios en excelente solución de Ishmaeel. Prefiero llamar a BeginInvoke solo si el cursor necesita moverse. También llamo al método desde varios manejadores de eventos, por lo que el parámetro de entrada es el MaskedTextBox activo.

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); }); 
} 
+0

Me gusta esta respuesta la mejor - +1. Además, funciona para mí sin el BeginInvoke. Probablemente solo sea necesario si está definiendo PositionCursorInMaskedTextBox como un método auxiliar que se puede llamar en cualquier parte de su programa. –

3
//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); 
} 
0

Esta solución funciona para mí. Pruébalo por favor.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 

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

Hice que el mío funcionara con el evento Click .... no se necesitó invocación.

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