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

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

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

当我删除RichTextBox的ReadOnly-ness时,此功能成功.看起来有点奇怪,因为AppendText成功,但我明白选择是一个不同的野兽.

我可以这样做,以便ReadOnly RichTextBox可以通过编程方式进行修改吗?

Private Sub onNewData(ByRef data As String) Handles _server.clientSentData

    ' 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 = 200
    Dim textLength = rtMessages.TextLength()
    While textLength > MAX_TEXT_LENGTH
        Dim i As Int16 = 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

        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

解决方法

虽然尝试在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}"

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...