【发布时间】:2010-10-18 21:17:33
【问题描述】:
如何使用 C# 滚动到 WinForms TextBox 中的指定行?
谢谢
【问题讨论】:
-
什么样的文本框(ASP.NET、WinForms、WPF?)以及“转到”到底是什么意思?选择整行?强制它滚动到视图中?
-
WinForms...移动鼠标到指定行
-
ican 循环如何影响文本框?我是编程初学者
如何使用 C# 滚动到 WinForms TextBox 中的指定行?
谢谢
【问题讨论】:
以下是滚动到所选内容的方式:
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 数组中获取它。在我的例子中,我在显示的文本中添加了行号,所以这让生活更轻松。
【讨论】: