wake-up-neo.com

Wie finde ich die Position eines Cursors in einem Textfeld? C #

Ich habe eine Standard-WinForms-TextBox und möchte Text an der Cursorposition in den Text einfügen. Wie kann ich die Position des Cursors ermitteln?

Vielen Dank

51
James May

Unabhängig davon, ob ein Text ausgewählt ist, repräsentiert die Eigenschaft SelectionStart den Index des Textes, an dem Sie sich befinden. Sie können also String.Insert verwenden, um Text wie folgt einzufügen:

myTextBox.Text = myTextBox.Text.Insert(myTextBox.SelectionStart, "Hello world");
76
Matt Hamilton

Sie möchten die SelectionStart-Eigenschaft der TextBox überprüfen. 

13
David Morton

James, es ist ziemlich ineffizient, dass Sie die gesamte Zeichenfolge ersetzen müssen, wenn Sie nur Text an der Cursorposition einfügen möchten.

Eine bessere Lösung wäre:

textBoxSt1.SelectedText = ComboBoxWildCard.SelectedItem.ToString();

Wenn Sie nichts ausgewählt haben, wird der neue Text an der Cursorposition eingefügt. Wenn Sie etwas ausgewählt haben, wird der ausgewählte Text durch den Text ersetzt, den Sie einfügen möchten.

Ich habe diese Lösung von der eggheadcafe-Site gefunden.

6
MaDDoG

Alles was Sie tun müssen, ist folgendes:

Doppelklicken Sie auf das Element (Schaltfläche, Beschriftung, was auch immer), das Text am Cursor in das Dokument einfügt. Geben Sie dann Folgendes ein:

richTextBox.SelectedText = "whatevertextyouwantinserted";
4
Patrick

Bei welchem ​​Ereignis würden Sie vorschlagen, die Variable aufzuzeichnen? Verlassen?

Zur Zeit habe ich:

private void comboBoxWildCard_SelectedIndexChanged(object sender, EventArgs e)
{
    textBoxSt1.Focus();
    textBoxSt1.Text.Insert(intCursorPos, comboBoxWildCard.SelectedItem.ToString());

}

private void textBoxSt1_Leave(object sender, EventArgs e)
{
    intCursorPos = textBoxSt1.SelectionStart;
}

Die Aufzeichnung des Leave-Ereignisses funktioniert, aber der Text wird nicht eingefügt. Fehlt mir etwas?

UPDATE: Ich brauchte textBoxSt1.Text = 

textBoxSt1.Text = textBoxSt1.Text.Insert(intCursorPos, comboBoxWildCard.SelectedItem.ToString());

Danke euch allen.

Vielen Dank

2
James May

Hier ist meine Arbeitsweise, bei der ich nur Ziffern eingeben kann und die letzte gültige Position des Texteingabewerts wiederherstellen kann:

Xaml:

<TextBox
      Name="myTextBox" 
      TextChanged="OnMyTextBoxTyping" />

Code hinter:

private void OnMyTextBoxTyping(object sender, EventArgs e)
{
    if (!System.Text.RegularExpressions.Regex.IsMatch(myTextBox.Text, @"^[0-9]+$"))
    {
        var currentPosition = myTextBox.SelectionStart;
        myTextBox.Text = new string(myTextBox.Text.Where(c => (char.IsDigit(c))).ToArray());
        myTextBox.SelectionStart = currentPosition > 0 ? currentPosition - 1 : currentPosition;
    }
}
2
Fragment

Sie müssen die SelectionStart -Eigenschaft in einer Variablen beibehalten. Wenn Sie dann auf die Schaltfläche drücken, verschieben Sie den Fokus zurück in das Textfeld. Legen Sie dann die SelectionStart-Eigenschaft auf die in der Variable fest.

1
masfenix
int cursorPosition = textBox1.SelectionStart;
//it will extract your current cursor position where ever it is
//textBox1 is name of your text box. you can use one
//which is being used by you in your form
1

Um die Einfügemarke zu erhalten, wenn Sie mit der Maus in den Text einer TextBox klicken, verwenden Sie das Ereignis TextBoxMouseDown. Erstellen Sie einen Punkt mit den X- und Y-Eigenschaften der Variablen MouseEventArgs. Die Variable TextBox hat eine Methode namens GetCharIndexFromPosition(point). Übergeben Sie den Punkt und es wird die Caret-Position zurückgegeben. Dies funktioniert, wenn Sie mit der Maus bestimmen, wo Sie den neuen Text einfügen möchten.

0
Charles F