恢复包含大量数据的文本框的WinForm
本文关键字:文本 WinForm 数据 包含大 恢复 | 更新日期: 2023-09-27 17:50:39
我在c# (VS2010)中创建了一个包含(除其他外)文本框控件的表单。文本框可能包含大量的数据(~ 300万字符)。
当滚动或移动表单时没有遇到任何问题,但是当表单最小化并再次恢复时,会触发重新绘制序列(我相信),这会导致表单重新绘制大约5-10秒的大延迟。
我已经尝试了几种解决方案:
-
使用双缓冲-根据我所读到的,双缓冲只适用于表单本身,而不是它的控件
this.SetStyle(ControlStyles.DoubleBuffer, true);
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);
-
禁用文本框重新绘制一次最小化使用:
SendMessage(this.my_textBox.Handle, WM_SETREDRAW, false, 0);
并且在状态恢复后恢复。我注意到,如果我不重新启用文本框重绘,则窗体重绘滞后也存在。 -
使用位图手动双缓冲区-结果与#1相似。
我在某处读到这个问题可能与文本框控件试图缩小或调整数据量有关,但无法覆盖它。
我以前在MFC中有相同的项目,但没有遇到任何重绘或滞后问题。
请告诉我如何解决这个问题
找到问题了!!问题与文本框锚属性有关。一旦我删除它,窗口立即恢复。顺便说一句,新的自定义类是不需要的
这是可能的我不理解的东西(或者也许有一个原因你不能这样做),但你不能只是派生自己的TextBox类吗?
public class MyTextBox : TextBox
{
public MyTextBox() : base()
{
SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.OptimizedDoubleBuffer, true);
SetStyle(ControlStyles.ResizeRedraw, false);
}
}
然后用它来代替常规的文本框?