Как прокручивать заданную строку в текстовом поле WinForms с помощью С#?
Спасибо
Как прокручивать заданную строку в текстовом поле WinForms с помощью С#?
Спасибо
Здесь вы перейдете к выбору:
textBox.ScrollToCaret();
Чтобы прокрутить до указанной строки, вы можете пропустить свойство TextBox.Lines, суммировать их длину, чтобы найти начало указанной строки, а затем установить TextBox.SelectionStart для размещения каретки.
Что-то вдоль строк этого (непроверенный код):
int position = 0;
for (int i = 0; i < lineToGoto; i++)
{
position += textBox.Lines[i].Length;
}
textBox.SelectionStart = position;
textBox.ScrollToCaret();
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();
}
Это лучшее решение, которое я нашел:
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);
}
Это имеет преимущество, что позиция выбора и каретки не изменяется.
Циклический ответ для поиска правильной позиции каретки имеет пару проблем. Во-первых, для больших текстовых полей он медленный. Во-вторых, символы табуляции, похоже, запутывают его. Более прямой маршрут - использовать текст в строке, которую вы хотите.
String textIWantShown = "Something on this line.";
int position = textBox.Text.IndexOf(textIWantShown);
textBox.SelectionStart = position;
textBox.ScrollToCaret();
Этот текст должен быть уникальным, конечно, но вы можете получить его из массива textBox.Lines. В моем случае у меня были добавленные номера строк в текст, который я показывал, поэтому это облегчило жизнь.