【问题标题】:How can I scroll to a specified line in a WinForms TextBox using C#?如何使用 C# 滚动到 WinForms TextBox 中的指定行?
【发布时间】:2010-10-18 21:17:33
【问题描述】:

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

谢谢

【问题讨论】:

  • 什么样的文本框(ASP.NET、WinForms、WPF?)以及“转到”到底是什么意思?选择整行?强制它滚动到视图中?
  • WinForms...移动鼠标到指定行
  • ican 循环如何影响文本框?我是编程初学者

标签: c# winforms textbox line


【解决方案1】:

以下是滚动到所选内容的方式:

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

【讨论】:

  • 或者,"position = textBox.Text.Length" 以避免循环。
  • 您可以使用 GetFirstCharIndexFromLine() 来代替循环。存在与显示行与分配行相关的问题,请参阅msdn.microsoft.com/en-us/library/…
【解决方案2】:
    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();
    }

【讨论】:

    【解决方案3】:

    这是我找到的最佳解决方案:

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

    它的好处是选择和插入符号的位置不会改变。

    【讨论】:

      【解决方案4】:

      寻找正确插入符号位置的循环答案有几个问题。首先,对于大文本框,它很慢。其次,制表符似乎会混淆它。更直接的方法是使用您想要的行上的文本。

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

      当然,此文本必须是唯一的,但您可以从 textBox.Lines 数组中获取它。在我的例子中,我在显示的文本中添加了行号,所以这让生活更轻松。

      【讨论】:

      • 循环确实有问题,它对我不起作用。似乎每行的计数都减少了 1。在任何情况下,都可以使用 GetFirstCharIndexFromLine(),它对我有用。
      • -1:顺便说一句,我相信你的方法是错误的。如果用户想要滚动到恰好是空的第 1000 行怎么办?您的代码将转到“1000”的第一次出现,它不必在第 1000 行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多