如何以编程方式从ReadOnly RichTextBox中删除文本?

时间:2012-11-10 01:12:39

标签: vb.net richtextbox

以下代码旨在维护ReadOnly RichTextBox中的文本缓冲区,其中存储了最大字符数,并始终保持滚动到底部。它会传输实时日志。

但是在我尝试保持最大字符数时,rtMessages.TextLength()rtMessages.SelectedText = String.Empty之后没有变化,因此,如果没有防御If阻止,我最终会无限循环尝试重复删除缓冲区的第一行。

当我删除ReadOnly的{​​{1}}时,此功能会成功。似乎有点奇怪,因为RichTextBox成功,但我知道选择是一个不同的野兽。

我是否可以将AppendText ReadOnly 以编程方式修改?

RichTextBox

4 个答案:

答案 0 :(得分:3)

尝试在ReadOnly RichTextBox中替换SelectedText时不起作用,使用SelectedRtf确实有效:

  'rtMessages.Select()
  'rtMessages.SelectionStart = 0
  'rtMessages.SelectionLength = i
  'rtMessages.SelectedText = String.Empty
  'rtMessages.SelectionLength = 0

  rtMessages.Select(0, i)
  rtMessages.SelectedRtf = "{\rtf1\ansi}"

答案 1 :(得分:0)

rtMessages.SelectionLength = i - 1

应替换为

rtMessages.SelectionLength = i

编辑#1

通过将-1添加到SelectionLength,您将丢失第一行的最后一个字符。在第二次运行中,第一行上只有1个字符(第一次运行时错过的字符)。然后你将尝试删除一个0的SelectionLength,你将获得相同的TextLength用于其他每一次运行,并且你将使用无限循环!

答案 2 :(得分:0)

您可以删除只读参数,编写附加文本代码,然后再次使richtextbox只读。

答案 3 :(得分:0)

我知道这是一个旧帖子,但你可以解决ReadOnly问题,取代以下代码:

 rtMessages.Select()
 rtMessages.SelectionStart = 0
 rtMessages.SelectionLength = i
 rtMessages.SelectedText = String.Empty
 rtMessages.SelectionLength = 0

用这个:

 rtMessages.Text = rtMessages.Text.Substring(i)

我不确定这是更好还是更差的表现,但它会将RichTextBox设置为ReadOnly

编辑:

以下是用于测试此内容的完整代码(注意:我已将代码添加到Button.Click进行测试)

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Static X As Integer = 0
    X += 1

    Dim Data As String = "Line " & X.ToString & ControlChars.NewLine
    Me.onNewData(Data)
End Sub

Private Sub onNewData(ByRef data As String)

    ' Add new text
    rtMessages.SelectionStart = rtMessages.TextLength()
    rtMessages.AppendText(data)

    ' Delete oldest text line-by-line until the whole buffer is shorter than MAX_TEXT_LENGTH characters
    Const MAX_TEXT_LENGTH As Integer = 200
    Dim textLength As Integer = rtMessages.TextLength()
    While textLength > MAX_TEXT_LENGTH
        Dim i As Integer = 0
        Do While rtMessages.GetLineFromCharIndex(i) < 1
            i += 1
        Loop

        'rtMessages.Select()
        'rtMessages.SelectionStart = 0
        'rtMessages.SelectionLength = i
        'rtMessages.SelectedText = String.Empty
        'rtMessages.SelectionLength = 0

        rtMessages.Text = rtMessages.Text.Substring(i)

        If rtMessages.TextLength() = textLength Then
            rtMessages.Clear()
            rtMessages.AppendText("[buffer trimming algorithm failed]")
            Exit While
        End If

        textLength = rtMessages.TextLength()
    End While

    ' Scroll down
    rtMessages.SelectionStart = rtMessages.TextLength()
    rtMessages.ScrollToCaret()

End Sub