Comment puis-je faire défiler jusqu'à une ligne spécifiée dans une zone de texte WinForms en utilisant C#?Comment puis-je faire défiler jusqu'à une ligne spécifiée dans une zone de texte WinForms en utilisant C#?
Merci
Comment puis-je faire défiler jusqu'à une ligne spécifiée dans une zone de texte WinForms en utilisant C#?Comment puis-je faire défiler jusqu'à une ligne spécifiée dans une zone de texte WinForms en utilisant C#?
Merci
Voici comment vous faites défiler à la sélection:
textBox.ScrollToCaret();
Pour faire défiler une ligne donnée, vous en boucle pourrait par la propriété TextBox.Lines, le total de leurs longueurs pour trouver le début de la ligne spécifiée, puis définissez TextBox.SelectionStart pour positionner le curseur.
Quelque chose le long des lignes de ce (code non testé):
int position = 0;
for (int i = 0; i < lineToGoto; i++)
{
position += textBox.Lines[i].Length;
}
textBox.SelectionStart = position;
textBox.ScrollToCaret();
+1 pour comprendre la question :) – SirDemon
je vous remercie pour votre réponse ... – alinpopescu
Alternativement, "position = textBox.Text.Length" pour éviter la boucle. –
La réponse en boucle pour trouver la position adéquate caret a quelques problèmes. Tout d'abord, pour les grandes zones de texte, c'est lent. Deuxièmement, les caractères de tabulation semblent le confondre. Une route plus directe consiste à utiliser le texte sur la ligne que vous voulez.
String textIWantShown = "Something on this line.";
int position = textBox.Text.IndexOf(textIWantShown);
textBox.SelectionStart = position;
textBox.ScrollToCaret();
Ce texte doit être unique, bien sûr, mais vous pouvez l'obtenir à partir du tableau textBox.Lines. Dans mon cas, j'avais ajouté des numéros de ligne au texte affiché, ce qui m'a facilité la vie.
Le bouclage a en effet des problèmes, cela n'a pas fonctionné pour moi. Il semblait que le compte était de 1 pour chaque ligne. Dans tous les cas, on peut utiliser GetFirstCharIndexFromLine(), qui a fonctionné pour moi. – Joh
-1: En passant, je crois que votre méthode est fausse. Que faire si l'utilisateur veut faire défiler jusqu'à la ligne 1000, qui se trouve être vide? Votre code ira à la première occurrence de "1000", qui ne doit pas être sur la ligne 1000. – Joh
private void MoveCaretToLine(TextBox txtBox, int lineNumber)
{
txtBox.HideSelection = false;
txtBox.SelectionStart = txtBox.GetFirstCharIndexFromLine(lineNumber - 1);
txtBox.SelectionLength = txtBox.Lines[lineNumber - 1].Length;
txtBox.ScrollToCaret();
}
C'est la meilleure solution que je trouve:
const int EM_GETFIRSTVISIBLELINE = 0x00CE;
const int EM_LINESCROLL = 0x00B6;
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);
void SetLineIndex(TextBox tbx, int lineIndex)
{
int currentLine = SendMessage(textBox1.Handle, EM_GETFIRSTVISIBLELINE, 0, 0);
SendMessage(tbx.Handle, EM_LINESCROLL, 0, lineIndex - currentLine);
}
Il a l'avantage que la position de sélection et caret ne change pas.
Quel type de zone de texte (ASP.NET, WinForms, WPF?) Et que voulez-vous dire par "aller à"? Sélectionnez la ligne entière? Forcer pour faire défiler la ligne dans la vue? –
WinForms ... déplace la souris sur la ligne spécifiée – alinpopescu
comment la boucle ican a-t-elle traversé la TextBox? je suis un débutant en programmation – alinpopescu