Question

Je voudrais pouvoir modifier le comportement par défaut du positionnement du curseur dans une zone de texte masquée.

La valeur par défaut est de placer le curseur inséré sur lequel la souris a été cliquée. La zone de texte masquée contient déjà des caractères dus au masque.

Je sais que vous pouvez masquer le curseur comme indiqué dans ce post , existe-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.

Était-ce utile?

La solution

Cela devrait faire l'affaire:

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

Autres conseils

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. Il n'enlève rien à la capacité de l'utilisateur de positionner le curseur au milieu des données saisies (c.-à-d. qu'il ne force pas le curseur à se positionner à zéro lorsque la boîte n'est pas vide).

Je trouve que cela ressemble davantage à une zone de texte standard. Le seul problème qui reste (ce que je peux voir), c’est qu’après l’événement 'Enter', l’utilisateur peut toujours sélectionner le reste de l’invite de masque (vide) si xe maintient la souris enfoncée et traîne à la fin.

C'est une grande amélioration par rapport au comportement par défaut de MaskedTextBoxes. Merci!

J'ai apporté quelques modifications à 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 à partir de divers gestionnaires d'événements. Le paramètre d'entrée est donc 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 ); });
}

Réponse partielle: vous pouvez positionner le curseur en attribuant au contrôle une sélection de longueur 0, dans l'événement MouseClick, par exemple:

.
MaskedTextBox1.Select(5, 0)

... définira le curseur à la position du 5ème caractère dans la zone de texte.

Si cette réponse n’est que partielle, c’est que je ne trouve pas de moyen généralement fiable de déterminer la position où le curseur devrait être positionné sur un clic. Cela est 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 la saisie de l’utilisateur réel ...

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

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

Le mien a été créé avec l'événement Click. Aucun appel n'a été nécessaire.

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

Cette solution utilise la méthode Click de MaskedTextBox telle que Gman Cornflake utilisée; Cependant, j’ai jugé nécessaire de permettre à l’utilisateur de cliquer à l’intérieur de la MaskedTextBox une fois qu’elle contenait des données et que le curseur reste là où il est.

L'exemple ci-dessous désactive les invites et les littéraux et évalue la longueur des données dans MaskedTextBox. S'il est égal à 0, il place le curseur à la position de départ. sinon, il contourne simplement le code qui place le curseur à la position de départ.

Le code est écrit en VB.NET 2017. J'espère que cela vous aidera!

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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top