2010-02-02 34 views
1

有没有办法在操作控件时推迟更新/重新绘制表单?推迟表单更新

我在窗体上使用TableLayoutPanel控件,我想在运行时动态地将不同的用户控件添加到表格的不同单元格中。

当我这样做时,屏幕更新太慢,并且有一些闪烁的动作发生。

tablelayout.SuspendLayout() 

SuspendLayout()似乎没有效果。

+0

重复的http://stackoverflow.com/questions/126876/how-do-i-disable-updating-a-form-in-winforms – 2010-02-02 21:03:19

回答

1

我完全得到了通过创建一个继承了表,然后启用doublebuffering类摆脱闪烁。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace myNameSpace.Forms.UserControls 
{ 
    public class TableLayoutPanelNoFlicker : TableLayoutPanel 
    { 
     public TableLayoutPanelNoFlicker() 
     { 
      this.DoubleBuffered = true; 
     } 
    } 
} 
1

它取决于控制;寻找BeginUpdate/EndUpdateBeginEdit/EndEdit等(并将它们用于try/finally区块)。但是,请注意,只有一些控件具有这些方法,并且它们不绑定到方便的接口,因此它有点手动。例如:

listView.BeginUpdate(); 
    try 
    { 
     for (int i = 0; i < 100; i++) 
     { 
      listView.Items.Add("Item " + i); 
     } 
    } 
    finally 
    { 
     listView.EndUpdate(); 
    } 

请注意,数据绑定控件可能具有用于禁用与数据相关的更改的其他机制;例如,BindingList<T>有一个可设置的RaiseListChangedEvents,可在编辑数据时关闭更改通知。你也可以看看像“虚拟模式”的东西。

0

您可以尝试SuspendLayout/ResumeLayout - 这是表单设计器生成的代码如何执行它 - 在表单后面的代码中查看InitializeComponents方法以查看我的意思。

1

尝试:

try { 
    SuspendLayout(); 

    // manipulate your controls 

} finally { 
    ResumeLayout(); 
}