如何修复 TableLayoutPanel 上显示的滚动条?
How to fix scrollbar showing on TableLayoutPanel?
在我的 winform 中得到一个 TableLayoutPanel
,以提高加载速度。我尝试暂停它的布局,添加行并恢复布局。
可悲的是,如果我暂停直到所有行都被添加,我会得到一个水平滚动条,如果我在添加之前恢复布局或再次添加每行之后暂停,我将不会出现该水平滚动条。
Msdn 表示 "Add method reapplies the table layout to all the controls":
这就是我在添加所有行后必须通过自己的代码重现的内容。然而,最后添加另一行不会产生根本不暂停的布局。
我试过了:
- 将第一列的内容替换为
new Control()
只是为了测试内容是否太大。
- 更改内容大小 -> 导致内容更小、空格更多和同样的问题
- 更改 tableLayoutPanel 的大小 -> 导致更小的控件仍然存在相同的问题
- 将第一列的大小(因为后两列具有绝对值)从 100% 更改为较低的百分比值、自动调整大小和类似的绝对值 -> 导致最后一列开始变大,滚动条仍然可见
PerformLayout()
添加行后
Refresh()
添加行后
ResumeLayout(true)
强制挂起布局requests/changes(绝对应该给我我想要的布局,并且不用暂停就可以得到,可能有bug或者什么东西被覆盖了?)
Update()
添加行后
tl;dr 添加行,滞后,无滚动条 vs 暂停,添加行,水平滚动条
为什么以及如何不?
发现如果我添加 EXACTLY 5 行,如果没有所有的暂停和恢复,我会遇到同样的问题:4 工作正常,因为不需要滚动条,6 删除水平滚动条,5 有错误。所以问题比布局暂停更深层次。总体上添加指定数量的行肯定有问题。 -> 外包给 (这个需要)-> 解决了外包问题,
暂停,直到我再次遇到暂停问题
这个问题和我外包解决的一个问题有关,考虑那边的代码作为主要解决方案,这是一个小补充。
如问题评论中所述,我必须在不暂停的情况下添加特定数量的行(与 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();
。
即使隐藏父控件也不能阻止用户看到行是如何消失的,同样在再次显示控件之后,table 边框先显示在内容本身之前加载。所以这个解决方案并不完美,但它的工作范围在这里就足够了。
在我的 winform 中得到一个 TableLayoutPanel
,以提高加载速度。我尝试暂停它的布局,添加行并恢复布局。
可悲的是,如果我暂停直到所有行都被添加,我会得到一个水平滚动条,如果我在添加之前恢复布局或再次添加每行之后暂停,我将不会出现该水平滚动条。
Msdn 表示 "Add method reapplies the table layout to all the controls":
这就是我在添加所有行后必须通过自己的代码重现的内容。然而,最后添加另一行不会产生根本不暂停的布局。
我试过了:
- 将第一列的内容替换为
new Control()
只是为了测试内容是否太大。 - 更改内容大小 -> 导致内容更小、空格更多和同样的问题
- 更改 tableLayoutPanel 的大小 -> 导致更小的控件仍然存在相同的问题
- 将第一列的大小(因为后两列具有绝对值)从 100% 更改为较低的百分比值、自动调整大小和类似的绝对值 -> 导致最后一列开始变大,滚动条仍然可见
PerformLayout()
添加行后Refresh()
添加行后ResumeLayout(true)
强制挂起布局requests/changes(绝对应该给我我想要的布局,并且不用暂停就可以得到,可能有bug或者什么东西被覆盖了?)Update()
添加行后
tl;dr 添加行,滞后,无滚动条 vs 暂停,添加行,水平滚动条
为什么以及如何不?
发现如果我添加 EXACTLY 5 行,如果没有所有的暂停和恢复,我会遇到同样的问题:4 工作正常,因为不需要滚动条,6 删除水平滚动条,5 有错误。所以问题比布局暂停更深层次。总体上添加指定数量的行肯定有问题。 -> 外包给
暂停,直到我再次遇到暂停问题
这个问题和我外包解决的一个问题有关
如问题评论中所述,我必须在不暂停的情况下添加特定数量的行(与 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();
。
即使隐藏父控件也不能阻止用户看到行是如何消失的,同样在再次显示控件之后,table 边框先显示在内容本身之前加载。所以这个解决方案并不完美,但它的工作范围在这里就足够了。