Cor*_*rty 4 .net c# tablelayoutpanel winforms
我有一个包含2列TableLayoutPanel的用户控件,并接受命令来动态添加行以显示在单独控件中选择的项目的详细信息.因此,用户将在另一个控件(DataGridView)中选择一行,并在DataGridView的SelectedItemChanged事件处理程序中清除详细控件,然后重新生成新选定项的所有行(可能具有完全不同的细节)从先前选择的项目中显示).这很有用.但是如果我长时间从一个选定的项目移动到另一个项目,刷新变得非常慢(每个3-5秒).这听起来好像我没有妥善处理一切,但我无法弄清楚我错过了什么.这是我清除TableLayoutPanel的代码:
private readonly List<Control> controls;
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();
}
Run Code Online (Sandbox Code Playgroud)
一旦我完成了将我想要的所有控件加载到TableLayoutPanel中以进行下一个细节显示,这就是我所说的:
public void Render()
{
detailTable.ResumeLayout(false);
detailTable.PerformLayout();
ResumeLayout(false);
detailTable.Visible = true;
}
Run Code Online (Sandbox Code Playgroud)
我在TableLayoutPanel中没有使用任何标签(和很少使用TextBox),我在创建它们时将标签和文本框添加到控件列表(在DisposeAndClearControls()中引用).我尝试迭代detailTable.Controls并以这种方式处理它们,但它似乎错过了一半的控件(通过在调试器中逐步执行它来确定).这样我知道我得到了所有.
我会对提高绘图性能的任何建议感兴趣,尤其是导致多次选择降级的原因.
小智 10
只需使用继承自TableLayoutPanel的自定义控件并将DoubleBuffered属性设置为true,效果很好......尤其是在动态添加或删除行时.
public CustomLayout()
{
this.DoubleBuffered = true;
InitializeComponent();
}
Run Code Online (Sandbox Code Playgroud)
我更改了包含表单,以便在每次选择更改时构造用户控件的新版本。它处理掉旧的并建造一个新的。这似乎表现得很好。无论如何,出于性能原因,我最初只是重复使用一个。显然这并不能提高性能。如果我处理掉旧的并创建一个新的,性能就不是问题。
不幸的是,TableLayoutPanel 会像这样泄漏。
| 归档时间: |
|
| 查看次数: |
12946 次 |
| 最近记录: |