使用包含大量数据的文本框还原WinForm

时间:2013-01-02 19:57:08

标签: c# winforms textbox restore repaint

我在C#(VS2010)中创建了一个包含(以及其他)文本框控件的表单。 文本框可能在某些时候包含大量数据(约300万个字符)。

当滚动或移动表单时,没有遇到任何问题,但是当表单被最小化并再次恢复时,会触发一个重绘序列(我相信),这会导致表单的大约滞后5-10秒重新粉刷。

我已经尝试了几种解决方案:

  1. 使用双缓冲区 - 根据我所读到的,双缓冲仅适用于表单本身而不适用于其控件

    this.SetStyle(ControlStyles.DoubleBuffer, true); this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true);

  2. 禁用文本框redrew一次最小化使用:SendMessage(this.my_textBox.Handle, WM_SETREDRAW, false, 0); 并在表单恢复后启用。我注意到,如果我不重新启用文本框重绘,表单重绘滞后也会存在。

  3. 使用位图的手动双缓冲区 - 与#1类似的结果。

  4. 我在某处读到这个问题可能与文本框控件有关,试图缩小或调整到数据量,但无法覆盖它。

    我以前在MFC中有过相同的项目,但没有遇到任何重复或滞后的问题。

    请告诉我如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

发现问题!!!问题与文本框Anchor属性有关。一旦我删除它,窗口恢复立即。顺便说一下,不需要新的自定义类

答案 1 :(得分:0)

我可能不理解某些东西(或者有可能是你不能这样做的原因),但是你不能像这样派生自己的TextBox类吗?

public class MyTextBox : TextBox
{
    public MyTextBox() : base()
    {
        SetStyle(ControlStyles.AllPaintingInWmPaint |
            ControlStyles.OptimizedDoubleBuffer, true);
        SetStyle(ControlStyles.ResizeRedraw, false); 
    }
}

然后使用它代替常规文本框?