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
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");
Sie möchten die SelectionStart
-Eigenschaft der TextBox
überprüfen.
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.
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";
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
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;
}
}
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.
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
Um die Einfügemarke zu erhalten, wenn Sie mit der Maus in den Text einer TextBox
klicken, verwenden Sie das Ereignis TextBox
MouseDown
. 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.