如何修复 TableLayoutPanel 上显示的滚动条?

How to fix scrollbar showing on TableLayoutPanel?

在我的 winform 中得到一个 TableLayoutPanel,以提高加载速度。我尝试暂停它的布局,添加行并恢复布局。 可悲的是,如果我暂停直到所有行都被添加,我会得到一个水平滚动条,如果我在添加之前恢复布局或再次添加每行之后暂停,我将不会出现该水平滚动条。

Msdn 表示 "Add method reapplies the table layout to all the controls":

这就是我在添加所有行后必须通过自己的代码重现的内容。然而,最后添加另一行不会产生根本不暂停的布局。

我试过了:


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 边框先显示在内容本身之前加载。所以这个解决方案并不完美,但它的工作范围在这里就足够了。