Как прокрутить до указанной строки в текстовом поле WinForms с помощью C #? - PullRequest
13 голосов
/ 11 апреля 2009

Как прокрутить до указанной строки в текстовом поле WinForms с помощью C #?

Спасибо

Ответы [ 4 ]

28 голосов
/ 11 апреля 2009

Вот как вы прокручиваете выбор:

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();
10 голосов
/ 28 октября 2012
    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();
    }
2 голосов
/ 24 августа 2015

Это лучшее решение, которое я нашел:

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

Преимущество заключается в том, что позиция выбора и каретки не изменяются.

0 голосов
/ 19 мая 2009

Циклический ответ для поиска правильного положения каретки имеет несколько проблем. Во-первых, для больших текстовых полей это медленно. Во-вторых, символы табуляции, кажется, запутывают это. Более прямой путь - использовать текст в нужной строке.

String textIWantShown = "Something on this line.";
int position = textBox.Text.IndexOf(textIWantShown);
textBox.SelectionStart = position;
textBox.ScrollToCaret();

Конечно, этот текст должен быть уникальным, но вы можете получить его из массива textBox.Lines. В моем случае я добавил номера строк к отображаемому тексту, так что это упростило жизнь.

...