有没有办法在操作控件时推迟表单更新/重新绘制?
我在表单上使用TableLayoutPanel
控件,我希望在运行时动态删除/添加不同的用户控件到表的不同单元格。
当我这样做时,屏幕更新太慢,并且发生了一些闪烁的动作。
tablelayout.SuspendLayout()
SuspendLayout()
似乎没有效果。
答案 0 :(得分:1)
这取决于控制;查找BeginUpdate
/ EndUpdate
或BeginEdit
/ 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方法,看看我的意思。