【发布时间】:2016-06-30 13:09:09
【问题描述】:
我有一个tableLayoutPanel,用于 Windows 窗体。该控件由包含 sql server 数据的datatable 填充。我已经确认select 声明不是问题。
数据表经常更新,所以tableLayoutPanel也经常更新。它基本上运行良好,但它变得有点慢,闪烁更明显。
每次我需要刷新控件时,都会执行这段代码:
public void FillTlp()
{
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.ColumnStyles.Clear();
foreach (DataRow r in DT.Rows)
{
UcColor button = new UcColor(r);
tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum);
}
this.Controls.Add(tableLayoutPanel1);
}
由于总是有 8 行,所以我在 Form 构造函数中只执行了一次以下代码,但我没有看到太多好处:
public FormDoctorMonitor()
{
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.RowCount = 8;
FillTlp();
}
我还能如何优化填充tableLayoutPanel?
谢谢。
【问题讨论】:
-
显而易见的问题:为什么“刷新”实际上是“从头开始构建”?只改变需要改变的地方。
-
如果没有MCVE,很难说问题出在哪里。只是一些提示:1- 在向面板添加新控件之前,首先要
Dispose之前添加的控件。目前您只删除它们。您应该同时执行删除和处置。 2- 在删除控件之前调用panel.SuspendLayout();并在添加新控件之后调用panel.ResumeLayout(true);可能会有所帮助。 -
@RezaAghaei,我应该在哪里添加
tableLayoutPanel1.Dispose();?如果我在开头添加它,我会得到运行时错误Cannot access disposed object。我已经根据您的建议修改了示例代码;如果他们在正确的地方,请告诉我。 -
@rbhatup 请不要编辑问题。目前编辑的代码将不起作用。最好回滚您的编辑。
-
使用 TLP 实现您自己的网格控制绝不是一个错误。使用 ListView 或 DataGridView 或去购物。
标签: c# winforms visual-studio-2010 tablelayoutpanel flowlayoutpanel