下面的代碼旨在保留一個文本緩衝區在一個ReadOnly
RichTextBox中,最大數量的字符存儲,並始終保持滾動到底部。它傳輸實時日誌。如何以編程方式從ReadOnly RichTextBox中刪除文本?
但在我試圖保持最大字符數,rtMessages.TextLength()
rtMessages.SelectedText = String.Empty
因此之後沒有改變,沒有防守If
塊,我結束了一個無限循環試圖多次刪除緩衝區的第一行。
當我刪除RichTextBox
的ReadOnly
時,此功能成功。似乎有點奇怪,因爲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
我可以確認這個'Sub'正在UI線程上調用,而不是一些通信線程。 –
+1,因爲問題不像看起來那麼簡單...我很羨慕沒有人在SO上提到過這一點。 –