【问题标题】:How do I remove the old data of a RichTextBox without moving scrollbar/ cursor如何在不移动滚动条/光标的情况下删除 RichTextBox 的旧数据
【发布时间】:2014-05-07 07:21:05
【问题描述】:

我为实时日志创建了一个 Richtexbox。如果richtexbox的长度太大,我会删除旧数据(比如当前数据的1/3)。

 Content.Invoke(new EventHandler(delegate
            {
               Content.AppendText(msg);   
                if(Content.Text.Length >100000)
                {
                    Content.Select(0, 50000);
                    Content.SelectedText = "";
                }
            }));

我的问题是每当我删除数据时,滚动条会向上(选择文本)并向下(附加新文本)。有没有办法防止滚动条上升?

【问题讨论】:

  • 如果我正确阅读了您的问题,他的文章可能会有所帮助:stackoverflow.com/questions/6695607/…
  • 我不想阻止它滚动到最后一行文本,我只想在我删除richtexbox顶部的文本时阻止它​​滚动到顶部(继续滚动到最后一行)跨度>
  • 也许SuspendLayout()ResumeLayout() 在您的更改前后会有帮助?此外,我没有看到您存储和重新计算 SelectionStart/End!?
  • 当我删除顶部的文本时,滚动条仍然会上升。顺便说一句,为什么我需要存储和重新计算 SelectionStart/End!?

标签: c# .net winforms richtextbox


【解决方案1】:

我在计时器中试过这个,对我来说看起来不错。显然,当您删除文本时滚动条会增长,但这应该会发生..

    private void timer1_Tick(object sender, EventArgs e)
    {
        richTextBox1.SuspendLayout();
        richTextBox1.AppendText( richTextBox1.Text.Length.ToString() +
           "  some random text of no consequence.....\n");
        if (richTextBox1.Text.Length > 10000)
        {
            richTextBox1.Select(0, 2000);
            richTextBox1.SelectedText = "";
        }

        richTextBox1.SelectionStart = richTextBox1.Text.Length;
        richTextBox1.SelectionLength = 0;
        richTextBox1.ScrollToCaret();
        richTextBox1.ResumeLayout();
    }

我假设您始终希望 RTB 的末尾可见,因此您必须将插入符号放在末尾且可见。如果您不这样做,则在删除文本的顶部后,插入符号将位于顶部。 无需存储插入符号的位置,除非您希望它保持在其他位置,可能是因为用户已将它放在那里..?但是,在这种情况下,您必须采取相应的行动并计算出正确的位置!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    • 2014-05-10
    • 1970-01-01
    • 2011-08-17
    • 1970-01-01
    • 2013-09-23
    • 2019-09-18
    相关资源
    最近更新 更多