2008-09-23 20 views
19

Je souhaite pouvoir remplacer le comportement par défaut pour positionner le curseur dans une zone de texte masquée.Positionner le curseur dans une MaskedTextbox

La valeur par défaut est de placer le curseur sur lequel la souris a été cliquée, la zone de texte masquée contient déjà des caractères en raison du masque.

Je sais que vous pouvez masquer le curseur comme mentionné dans ce post, y a-t-il quelque chose de similaire pour positionner le curseur au début de la zone de texte lorsque le contrôle obtient le focus.

Répondre

26

Cela devrait faire l'affaire:

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

Ahh, vous devez donc utiliser BeginInvoke! J'ai essayé cela sans le faire et j'ai fini par ne voir aucun changement. +1 – Jeremy

+0

Pourquoi avez-vous besoin d'utiliser BeginInvoke? – Vaccano

+0

@vaccano - ça marche pour moi sans le BeginInvoke –

3

réponse partielle: vous pouvez positionner le curseur en attribuant une sélection 0 longueur à la commande en cas MouseClick, par exemple:

MaskedTextBox1.Select(5, 0) 

. .. mettra le curseur sur la position du 5ème caractère dans la zone de texte.

La raison pour laquelle cette réponse est seulement partielle, est parce que je ne peux pas penser à un moyen généralement fiable de déterminer la position où le signe devrait être positionné sur un clic. Cela peut être possible pour certains masques, mais dans certains cas courants (par exemple le masque de numéro de téléphone américain), je ne peux pas vraiment penser à un moyen facile de séparer le masque et les caractères d'invite de l'entrée réelle ...

9

pour améliorer la solution de travail d'Abbas, essayez ceci:

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

ce gestionnaire d'événements peut être réutilisé avec plusieurs boîtes, et il ne supprime pas la capacité de l'utilisateur de positionner le curseur au milieu des données saisies (c'est-à-dire ne force pas le curseur en position zéro lorsque la case n'est pas vide). Je trouve que cela ressemble plus à une boîte de texte standard. Seul le pépin restant (que je peux voir) est qu'après l'événement 'Enter', l'utilisateur est toujours capable de sélectionner le reste de l'invite de masque (vide) si xe maintient la souris et glisse jusqu'à la fin.

+0

Merci pour le petit tweak. Juste ce dont j'avais besoin. –

+0

Vous pouvez répondre à cela avec le même code en l'utilisant pour les fonctions Enter et Click pour la Maskedtextbox :) – Mobin

6

C'est une grande amélioration par rapport au comportement par défaut de MaskedTextBoxes. Merci! J'ai fait quelques changements à l'excellente solution d'Ishmaeel. Je préfère appeler BeginInvoke uniquement si le curseur doit être déplacé. J'appelle également la méthode de divers gestionnaires d'événements, de sorte que le paramètre d'entrée est le MaskedTextBox actif.

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

J'aime cette réponse la meilleure - +1. Aussi, ça marche pour moi sans le BeginInvoke. Cela n'est probablement nécessaire que si vous définissez PositionCursorInMaskedTextBox comme une méthode d'assistance qui peut être appelée n'importe où dans votre programme. –

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

Cette solution fonctionne pour moi. Essayez-le s'il vous plaît.

private void maskedTextBox1_Click(object sender, EventArgs e) 
{ 

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

J'ai eu le mien pour travailler en utilisant l'événement Click .... aucune Invoke n'était nécessaire.

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