【问题标题】:How do I avoid having my Rich Text Box, "scroll bar," freeze up?如何避免我的富文本框“滚动条”冻结?
【发布时间】:2019-10-10 20:43:55
【问题描述】:

我的问题是在 .NET 框架中使用 C# 创建一个包含 富文本框 (RTB) 控件的简单表单应用程序。

简而言之,我遇到的问题是,当尝试清除 RTB 的内容 (.Text) 时,滚动条并没有消失。我想知道我使用 RTB 的方式是否存在任何固有问题。很抱歉,该网站不允许我发布图片。所以如果对“不会消失”是什么意思有误解,请追问!

首先,我使用以下代码 sn-p 将数据写入框:

// append the new message
this.rtb_receive_0.Text += message;
this.rtb_receive_0.SelectionStart = this.rtb_receive_0.Text.Length;
this.rtb_receive_0.ScrollToCaret();

稍后,我使用以下代码清除 RTB 内容(RTB.Text):

this.rtb_receive_0.Text = String.Empty;
this.rtb_receive_0.Refresh();

在上面的代码中,我尝试使用“刷新”方法来解决我的问题。然而,它似乎并没有完成这项工作。

当我清除 RTB 内容时,滚动条并没有消失……我注意到,如果我抓住另一个窗口并将其拖到应用程序的顶部,冻结的滚动条就会消失。另外,我可以最小化应用程序,然后再次最大化它,该栏就会消失。不过,首先必须有一种方法来防止这种冻结的滚动条发生。

根据答案,这是阻止酒吧冻结的修复方法:

this.rtb_receive_0.Text = String.Empty;
this.rtb_receive_0.Clear();
this.rtb_receive_0.ScrollBars = RichTextBoxScrollBars.None;
this.rtb_receive_0.ScrollBars = RichTextBoxScrollBars.Vertical;
this.rtb_receive_0.Refresh();

【问题讨论】:

  • 顺便问一下,您使用的是什么版本的 .NET?我刚刚尝试创建一个示例应用程序并设置MyRTB.Lines = myStringArray,它添加了一个滚动条。然后在按钮单击事件中我分配MyRTB.Lines = null 并正确清除。我还尝试设置.Text 而不是Lines,它的行为也正确。
  • 我的目标框架是“.NET Framework 4 Client Profile”。我现在注意到这与目标框架下拉列表中的“.NET Framework 4”是分开的。

标签: c# .net winforms richtextbox


【解决方案1】:

您是否尝试过仅以编程方式在 RTB 上设置 Scrollbars 属性?

myRichTextBox.ScrollBars = RichTextBoxScrollBars.None;

编辑:我想我误解了你的需要。搜了一圈,在另一个论坛上发现了一个类似的帖子:http://www.vbforums.com/showthread.php?793671-RESOLVED-RichTextBox-Visual-Bug

此用户正在根据列表视图中的选择设置 RTB 的值。当设置了新值并且不需要滚动条时,它不会重新绘制并仍然显示滚动条。

似乎添加myRichTextBox.Clear(); myRichTextBox.Refresh(); 应该会有所帮助。在这种情况下,该用户还以编程方式设置 ScrollBars 属性。

另外,在需要滚动条之前,您是否能够确定 RichTextBox 中可以容纳多少行文本?我想这可能会因机器上的系统设置而异,但您可能只能以编程方式检查myrtb.Scrollbars = (myrtb.Lines.Length > X) ? Vertical : None;(请原谅伪代码语法)

【讨论】:

  • 没有。所以你只是暂时摆脱滚动条以使 GUI 看起来滚动条不只是卡在原地吗?因为我会在某个时候需要滚动条。因为我在框中记录了 100 行左右的数据。
  • 非常感谢,这帮助很大。我将编辑我的帖子以显示完整的修复是什么。
  • 太好了,我知道我在我的单一答案中发布了一些建议,所以我实际上是想问是哪一点有效。
【解决方案2】:

对我有帮助的只是调用了两次refresh() 方法。非常丑陋,但它确实有效。

嗯,经过更彻底的测试后,这个丑陋的修复被证明并不是一个修复。它有帮助,但仍然存在一些故障。 刷新(); 更新(); 似乎是一个更好的解决方案。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我通过调用强制控件重绘的 Invalidate() 方法解决了这个问题。

    Me.RichTextBox.Clear()
    'Call Invalidate in order to force the RichTextBox to repaint.  I do this so that any 
    'Visible Scroll bars are removed after clearing the Text
    Me.RichTextBox.Invalidate()
    

    【讨论】:

      【解决方案4】:

      我试过 Refresh();更新(); Invalidate();,但它对我不起作用。

      我使用以下三行解决了这个问题:-

              RitchTextBox.Clear(); //Clearing text in RichTextBox
              RitchTextBox.ScrollBars = RichTextBoxScrollBars.None; //Remove scroll
              RitchTextBox.ScrollBars = RichTextBoxScrollBars.Vertical; //Again add scroll
      

      试试以上三行。它将工作 100%。

      【讨论】:

        猜你喜欢
        • 2012-06-27
        • 2012-05-03
        • 1970-01-01
        • 2015-04-16
        • 2020-11-11
        • 2011-05-21
        • 2017-07-14
        • 1970-01-01
        • 2018-03-26
        相关资源
        最近更新 更多