以下代码旨在维护ReadOnly
RichTextBox中的文本缓冲区,其中存储了最大字符数,并始终保持滚动到底部。它会传输实时日志。
但是在我尝试保持最大字符数时,rtMessages.TextLength()
在rtMessages.SelectedText = String.Empty
之后没有变化,因此,如果没有防御If
阻止,我最终会无限循环尝试重复删除缓冲区的第一行。
当我删除ReadOnly
的{{1}}时,此功能会成功。似乎有点奇怪,因为RichTextBox
成功,但我知道选择是一个不同的野兽。
我是否可以将AppendText
ReadOnly
以编程方式修改?
RichTextBox
答案 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