Frage

Ich möchte das Standardverhalten außer Kraft setzen können, in einem maskierten Textbox den Cursor zu positionieren.

Der Standardwert ist die Einfügemarke zu platzieren, wo die Maus geklickt wurde, die maskierte Textbox bereits Zeichen aufgrund der Maske enthält.

Ich weiß, dass Sie das Einfügemarke verstecken können, wie in dieser post , gibt es etwas ähnliches für am Anfang der Textbox den Cursor zu positionieren, wenn das Steuerelement den Fokus erhält.

War es hilfreich?

Lösung

Das sollte es tun:

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

Andere Tipps

Zur Verbesserung auf Abbas Arbeitslösung, versuchen Sie dies:

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

Diese Event-Handler mit mehreren Boxen wiederverwendet werden, und es braucht nicht die Fähigkeit des Benutzers die Cursor in der Mitte der eingegebenen Daten zu positionieren weg (also nicht die Cursor in nullten Position zwingt, wenn die Box nicht ist leer).

Das finde ich stärker sein, um ein Standard-Textfeld nachahmt. Nur Glitch verbleibenden (das ich sehen kann) ist, dass nach ‚Enter‘ Ereignis der Benutzer noch in der Lage ist, den Rest der (leeren) Maske Aufforderung auszuwählen, wenn xe die Maus nach unten hält und zieht bis zum Ende.

Das ist eine große Verbesserung gegenüber dem Standardverhalten von MaskedTextBoxes. Dank!

Ich habe ein paar Änderungen an Ishmaeel ausgezeichnete Lösung. Ich ziehe es BeginInvoke nur anrufen, wenn der Cursor bewegt werden muss. Ich nenne auch die Methode von verschiedenen Event-Handler, so wird der Eingangsparameter die aktive MaskedTextBox ist.

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

Partielle Antwort: Sie können die Position der Einfügemarke durch eine 0-Länge Auswahl an die Steuerung in dem Mouseclick-Ereignisse zuordnen, z.

MaskedTextBox1.Select(5, 0)

... wird die Einfügemarke an der fünften Zeichenposition in der Textbox gesetzt.

Der Grund, diese Antwort nur teilweise ist, ist, weil ich nicht von einer allgemein zuverlässigen Art und Weise denken kann, die Position, wo die Cursor zu bestimmen sollte auf einem Klick positioniert werden. Dies kann für einige Masken, aber in einigen Fällen gemeinsam (zum Beispiel die US-Telefonnummer Maske) möglich sein, kann ich nicht wirklich denke an eine einfache Möglichkeit, die Maske und prompt Zeichen von tatsächlichen Benutzereingabe zu trennen ...

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

Diese Lösung funktioniert für mich. Probieren Sie es bitte.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

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

Ich habe mich das Click-Ereignis arbeiten mit .... keine Invoke benötigt wurde.

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

Diese Lösung nutzt die Click-Methode des MaskedTextBox wie Gman Cornflake verwendet; Allerdings fand ich es notwendig, damit der Benutzer innerhalb des MaskedTextBox klicken, wenn sie Daten enthalten ist, und die Cursor bleiben, wo es ist.

Das Beispiel unten dreht off Eingabeaufforderungen und Literale und wertet die Länge der Daten in der MaskedTextBox und wenn gleich 0 setzt es den Cursor an der Startposition; sonst ist es umgeht nur den Code, um den Cursor an der Startposition bringt.

Der Code wird geschrieben in VB.NET 2017. hoffe, das hilft!

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top