web-dev-qa-db-fra.com

Comment trouver la position d'un curseur dans une zone de texte? C #

J'ai une zone de texte WinForms standard et je veux insérer du texte à la position du curseur dans le texte. Comment puis-je obtenir la position du curseur?

Merci

51
James May

Indépendamment du choix du texte, la propriété SelectionStart représente l'index dans le texte où vous vous trouvez. Vous pouvez donc utiliser String.Insert pour injecter du texte, comme ceci:

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

Vous voulez vérifier la propriété SelectionStart de la TextBox

13
David Morton

James, il est assez inefficace de devoir remplacer toute la chaîne lorsque vous souhaitez uniquement insérer du texte à la position du curseur.

Une meilleure solution serait:

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

Lorsque vous n'avez rien sélectionné, le nouveau texte sera inséré à la position du curseur . Si vous avez sélectionné un élément, cela remplacera le texte sélectionné par le texte que vous souhaitez insérer.

J'ai trouvé cette solution sur le site eggheadcafe .

6
MaDDoG

Tout ce que vous avez à faire est ceci:

Double-cliquez sur l'élément (bouton, étiquette, peu importe) qui insérera du texte dans le document au niveau du curseur. Puis tapez ceci dans:

richTextBox.SelectedText = "whatevertextyouwantinserted";
4
Patrick

Sur quel événement suggéreriez-vous que j'enregistre la variable? Laisser?

Actuellement j'ai:

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

L'enregistrement sur l'événement Leave fonctionne mais le texte n'est pas inséré. Quelque chose me manque-t-il?

UPDATE: J'avais besoin de textBoxSt1.Text = 

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

Merci a tous.

Merci

2
James May

Voici ma réalisation de travail, permettant de ne taper que des chiffres, avec la restauration de la dernière position de texte valide:

Xaml:

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

Code derrière:

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

Vous devez conserver la propriété SelectionStart dans une variable, puis lorsque vous appuyez sur le bouton, rétablissez le focus sur la zone de texte. Définissez ensuite la propriété SelectionStart sur celle de la variable.

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
Shafiq-Ur-Rehman

Pour obtenir la position du curseur lorsque vous cliquez avec la souris dans le texte d'une TextBox, utilisez l'événement TextBoxMouseDown. Créez un point en utilisant les propriétés X et Y de la MouseEventArgs. La TextBox a une méthode appelée GetCharIndexFromPosition(point). Passez le point et il retourne la position du curseur. Cela fonctionne si vous utilisez la souris pour déterminer où vous voulez insérer le nouveau texte.

0
Charles F