22 Stimmen

Positionieren des Cursors in einer MaskedTextbox

Ich möchte das Standardverhalten für die Positionierung der Einfügemarke in einem maskierten Textfeld außer Kraft setzen können.

Standardmäßig wird der Cursor an die Stelle gesetzt, an der die Maus angeklickt wurde, da das maskierte Textfeld aufgrund der Maske bereits Zeichen enthält.

Ich weiß, dass Sie die Einfügemarke ausblenden können, wie in diesem Artikel beschrieben Beitrag Gibt es etwas Ähnliches für die Positionierung der Einfügemarke am Anfang des Textfeldes, wenn das Steuerelement den Fokus erhält.

34voto

Abbas Punkte 6570

Damit sollte es klappen:

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

10voto

Ishmaeel Punkte 13903

Um die funktionierende Lösung von Abbas zu verbessern, versuchen Sie Folgendes:

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

Dieser Event-Handler kann für mehrere Felder wiederverwendet werden und nimmt dem Benutzer nicht die Möglichkeit, den Cursor in der Mitte der eingegebenen Daten zu positionieren (d.h. er zwingt den Cursor nicht in die Nullstellung, wenn das Feld nicht leer ist).

Ich finde, dass dies eher einem Standard-Textfeld ähnelt. Der einzige verbleibende Fehler (den ich sehen kann) ist, dass der Benutzer nach dem "Enter"-Ereignis immer noch in der Lage ist, den Rest der (leeren) Maske auszuwählen, wenn er die Maus gedrückt hält und bis zum Ende zieht.

7voto

Mike M Punkte 71

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

Ich habe ein paar Änderungen an Ishmaeels ausgezeichneter Lösung vorgenommen. Ich ziehe es vor, BeginInvoke nur dann aufzurufen, wenn der Cursor bewegt werden muss. Außerdem rufe ich die Methode von verschiedenen Event-Handlern aus auf, sodass der Eingabeparameter 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 ); });
}

3voto

mdb Punkte 50584

Teilantwort: Sie können den Cursor positionieren, indem Sie dem Steuerelement im MouseClick-Ereignis eine Auswahl der Länge 0 zuweisen, z. B:

MaskedTextBox1.Select(5, 0)

...setzt den Cursor an die 5. Zeichenposition im Textfeld.

Der Grund, warum diese Antwort nur teilweise ist, liegt darin, dass mir keine allgemein zuverlässige Methode einfällt, um die Position des Cursors zu bestimmen sollte auf einen Klick positioniert werden. Dies kann für einige Masken möglich sein, aber in einigen häufigen Fällen (z. B. die US-Telefonnummer Maske), kann ich nicht wirklich denken, eine einfache Möglichkeit, die Maske und Prompt-Zeichen von tatsächlichen Benutzereingabe zu trennen...

3voto

Brian Pressman Punkte 31
//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);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X