有没有办法加快在winforms文本框中显示大量文本?
有没有办法加快在winforms文本框中显示大量文本? 我的应用程序读取一个文件(可以大到20MB),然后将其显示到文本框(TextBoxX.Text = fileText;)。
显示文本的过程非常缓慢,有时需要几分钟。 问题是这个应用程序旨在快速向用户显示文件中的大量文本。
有没有办法更快地做到这一点? 也许使用某种缓存?
代码变化最小的解决方案是将整个文件内容读入变量,然后在每次迭代中调用Application.DoEvents()的循环中将内容的“块”附加到文本框中。
您仍然可以在加载时显示“正在加载请稍候…”消息,DoEvents调用将确保您的应用程序不会在同时“冻结”。
我知道这个问题现在已经很久了,但我想补充一些我认为可能对其他人有帮助的信息。
如果设置WordWrap = false,在某些情况下性能会显着提高。 当达到最大限制时,它仍将包裹长行。 我尝试了一些90K长的文本,其中包括一大块Base64数据,响应从16秒变为2秒。
如果您想将大量文本放入TextBox
则Text
属性是邪恶的。 相反,您应该以块的forms读取文件并使用AppendText()
函数添加它们。
如果你进一步将文件读取过程放入一个逐行读入文件的BackgroundWorker
然后报告ReportProgress中的每一行,你可以在那里实现AppendText(),它应该做得更顺畅。
更新
经过一些编码和测试后,我不得不承认上述方法听起来不错,但TextBox在每个AppendText()
之后需要这么多的渲染时间,这只是不起作用。
但是如果你对使用第三方控件没有任何问题,你应该看看Scintilla.Net 。 它对大文本文件没有任何问题,并且在这些情况下表现更好。
我认为只有一种方法 – 构建自己的控件(或者可能有一个)来显示文本的小部分(比如在远程管理器中,当你打开超大文件时)。
您定义了一个“窗口” – 例如500个字母,当您使用滚动条更改位置时,您可以更改yourtextbox的主体并显示文本的另一部分。
看看LockWindowUpdate函数,一旦将文本添加到文本框中,别忘了解锁。
http://msdn.microsoft.com/en-us/library/dd145034%28v=vs.85%29.aspx
我认为即使通过记事本打开,一个20Mb的文件也会有明显的延迟。
添加有关读取数据块的建议(这是大数据的最佳选择……就像在网络下载中certificate的那样)..
您可以在读取模式下将文本文件作为文件流打开..然后在循环中读取1mb或更少的字节内容..并将内容添加到文本框中。
伪代码:
while(不是文件结尾){string content =从流中读取1024 * 1024字节..将其转换为ascii编码。
textbox.text + = content
}
刚刚遇到这个问题,另一个可能的解决方法是使用RichTextBox。 与直观相反,考虑到与普通TextBox相比可以处理的更多内容,将RichTextBox的Text属性设置为非常大的字符串几乎是即时的。