在我的winform中获得TableLayoutPanel
,以提高加载速度。我尝试暂停它的布局,添加行并恢复布局。
遗憾的是,如果我暂停直到添加所有行,我会得到一个水平滚动条,如果我在添加或暂停后再次添加每一行之前恢复布局,则不会出现。
Msdn个州“添加方法将表格布局重新应用于所有控件”:
这是我在添加所有行后通过自己的代码重现的内容。但是,在最后添加另一行不会产生完全不挂起的布局。
我试过了:
new Control()
,以测试内容是否过大。PerformLayout()
Refresh()
ResumeLayout(true)
强制待处理的布局请求/更改(绝对应该给我我想要的布局并且无需暂停,可能有错误或者被覆盖的东西?) Update()
tl; dr添加行,滞后,无滚动条 vs 暂停,添加行,水平滚动条
为什么以及如何不去?
发现没有所有暂停和恢复我遇到同样的问题,如果我添加完全5行:4工作正常,因为不需要滚动条,6删除水平滚动条,5是错误。所以问题比布局暂停更深入。总体上添加指定数量的行肯定有问题。的 - >外包给new question (这个需要) - >解决了外包问题,
暂停,直到我偶然发现暂停问题
答案 0 :(得分:0)
这个问题与我外包并解决here的问题有关,请考虑那里的代码作为主要解决方案,这是一个小小的补充。
正如问题的评论中所述,我必须添加一定数量的行而不会暂停(与TableLayoutPanel
的高度相关),这似乎适用于大多数情况案例(inp.Count
是添加的行数):
tableLayoutPanel1.SuspendLayout();
int i;
while ((i = tableLayoutPanel1.Controls.Count) >= 2) {
tableLayoutPanel1.Controls[--i].Dispose();
tableLayoutPanel1.Controls[--i].Dispose();
tableLayoutPanel1.Controls[--i].Dispose();
}
while (tableLayoutPanel1.RowStyles.Count > 0) {
tableLayoutPanel1.RowStyles.RemoveAt(tableLayoutPanel1.RowStyles.Count - 1);
}
tableLayoutPanel1.RowCount = 0;
for(int i=0; i<inp.Count; i++){
if (i > inp.Count - 6) {
tableLayoutPanel1.ResumeLayout();
}
//...
}
检查以上链接的解决方案,查看inp.Count
不足以修复水平滚动条的情况。
这大大改善了加载时间,但是视觉元素仍然存在滞后,为什么我决定在开头添加tableLayoutPanel1.Hide();
并在结尾添加tableLayoutPanel1.Show();
。
即使隐藏父控件也不会阻止用户看到行如何消失,同样在再次显示控件之后,在加载内容本身之前首先显示表边框。所以这个解决方案并不完美,但它的工作范围应该足够了。