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.

1voto

Joelius Punkte 3180

Ich weiß, dass dies eine alte Frage ist, aber Google hat mich mehrfach hierher geführt und keine der Antworten entspricht genau dem, was ich will.
Zum Beispiel funktionieren die aktuellen Antworten nicht so, wie ich es möchte, wenn Sie TextMaskFormat = MaskFormat.ExcludePromptAndLiterals .

Mit der folgenden Methode springt der Cursor auf die erste Aufforderung wenn das Textfeld eingegeben wird. Sobald Sie das Textfeld eingegeben haben, können Sie den Cursor frei bewegen. Es funktioniert auch gut für MaskFormat.ExcludePromptAndLiterals .

Deshalb denke ich, es lohnt sich, dies hier zu lassen :)

private void MaskedTextBox_Enter(object sender, EventArgs e)
{
    // If attached to a MaskedTextBox' Enter-Event, this method will
    // make the cursor jump to the first prompt when the textbox gets focus.
    if (sender is MaskedTextBox textBox)
    {
        MaskFormat oldFormat = textBox.TextMaskFormat;
        textBox.TextMaskFormat = MaskFormat.IncludePromptAndLiterals;
        string fullText = textBox.Text;
        textBox.TextMaskFormat = oldFormat;

        int index = fullText.IndexOf(textBox.PromptChar);
        if (index > -1)
        {
            BeginInvoke(new Action(() => textBox.Select(index, 0)));
        }
    }
}

0voto

hmota Punkte 359

Diese Lösung funktioniert bei mir. Probieren Sie es bitte aus.

private void maskedTextBox1_Click(object sender, EventArgs e)
{

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

0voto

Gman Cornflake Punkte 1

Bei mir hat es mit dem Klick-Ereignis funktioniert....no Invoke wurde benötigt.

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

0voto

Bill Kamer Punkte 1

Diese Lösung verwendet die Click-Methode der MaskedTextBox wie Gman Cornflake; ich fand es jedoch notwendig, dem Benutzer zu erlauben, innerhalb der MaskedTextBox zu klicken, sobald sie Daten enthält und der Cursor dort bleibt, wo er ist.

Das folgende Beispiel schaltet Aufforderungen und Literale aus und wertet die Länge der Daten in der MaskedTextBox aus, und wenn sie gleich 0 ist, wird der Cursor an die Anfangsposition gesetzt; andernfalls wird der Code, der den Cursor an die Anfangsposition setzt, einfach umgangen.

Der Code ist in VB.NET 2017 geschrieben. Hoffentlich hilft das!

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

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