如何使用C#在WinForms TextBox中滚动到指定行?

14

如何使用C#在WinForms TextBox中滚动到指定行?

谢谢。


什么样的文本框 (ASP.NET、WinForms、WPF?),你所说的“前往”是指什么?选择整行?将其强制滚动到视图中? - Jon Skeet
WinForms...将鼠标移动到指定行 - alinpopescu
我怎样才能循环遍历文本框?我是编程的初学者。 - alinpopescu
4个回答

29

以下是如何滚动到所选内容的方法:

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

4
或者,使用"position = textBox.Text.Length"来避免循环。 - 3Dave
你可以使用GetFirstCharIndexFromLine()代替循环。关于显示行与指定行之间存在问题,请参阅http://msdn.microsoft.com/en-us/library/system.windows.forms.textboxbase.getfirstcharindexfromline.aspx。 - Joh

10
    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

我找到了最好的解决方案:

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

寻找正确插入符位置的循环答案存在一些问题。首先,对于大型文本框,它速度较慢。其次,制表符似乎会使其混淆。更直接的方法是使用您想要的行上的文本。

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

这个文本必须是独一无二的,但你可以从textBox.Lines数组中获取它。在我的情况下,我已经将行号添加到我显示的文本中,所以这使得操作更加简单。


循环确实存在问题,对我来说没有起作用。每行似乎都偏移了1个计数。无论如何,可以使用GetFirstCharIndexFromLine(),这对我有效。 - Joh
顺便说一下,我认为你的方法是错误的。如果用户想要滚动到第1000行,但那行恰好是空行怎么办?你的代码会去找第一个出现的“1000”,而这个位置不一定是在第1000行上。 - Joh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接