我有一个包含2列TableLayoutPanel的用户控件,并接受命令来动态添加行以显示在单独控件中选择的项目的详细信息.因此,用户将在另一个控件(DataGridView)中选择一行,并在DataGridView的SelectedItemChanged事件处理程序中清除详细控件,然后重新生成新选定项的所有行(可能具有完全不同的细节)从先前选择的项目中显示).这很有用.但是如果我长时间从一个选定的项目移动到另一个项目,刷新变得非常慢(每个3-5秒).这听起来好像我没有妥善处理一切,但我无法弄清楚我错过了什么.这是我清除TableLayoutPanel的代码:
private readonly Listcontrols; public void Clear() { detailTable.Visible = false; detailTable.SuspendLayout(); SuspendLayout(); detailTable.RowStyles.Clear(); detailTable.Controls.Clear(); DisposeAndClearControls(); detailTable.RowCount = 0; detailTable.ColumnCount = 2; } private void DisposeAndClearControls() { foreach (Control control in controls) { control.Dispose(); } controls.Clear(); }
一旦我完成了将我想要的所有控件加载到TableLayoutPanel中以进行下一个细节显示,这就是我所说的:
public void Render() { detailTable.ResumeLayout(false); detailTable.PerformLayout(); ResumeLayout(false); detailTable.Visible = true; }
我在TableLayoutPanel中没有使用任何标签(和很少使用TextBox),我在创建它们时将标签和文本框添加到控件列表(在DisposeAndClearControls()中引用).我尝试迭代detailTable.Controls并以这种方式处理它们,但它似乎错过了一半的控件(通过在调试器中逐步执行它来确定).这样我知道我得到了所有.
我会对提高绘图性能的任何建议感兴趣,尤其是导致多次选择降级的原因.
只需使用继承自TableLayoutPanel的自定义控件并将DoubleBuffered属性设置为true,效果很好......尤其是在动态添加或删除行时.
public CustomLayout() { this.DoubleBuffered = true; InitializeComponent(); }