下面的代码旨在维护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}"