推迟表单更新

时间:2010-02-02 20:58:18

标签: c# winforms

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

我在表单上使用TableLayoutPanel控件,我希望在运行时动态删除/添加不同的用户控件到表的不同单元格。

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

tablelayout.SuspendLayout()

SuspendLayout()似乎没有效果。

4 个答案:

答案 0 :(得分: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,可在您编辑数据时关闭更改通知。您还可以查看“虚拟模式”等内容。

答案 1 :(得分:1)

尝试:

try {
    SuspendLayout();

    // manipulate your controls

} finally {
    ResumeLayout();
}

答案 2 :(得分: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;
        }
    }
}

答案 3 :(得分:0)

您可以尝试使用SuspendLayout / ResumeLayout - 表单设计器生成的代码就是这样做的 - 查看表单后面的代码中的InitializeComponents方法,看看我的意思。