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

时间:2017-07-05 14:53:28

标签: c# winforms layout tablelayoutpanel

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

Msdn个州“添加方法将表格布局重新应用于所有控件”

这是我在添加所有行后通过自己的代码重现的内容。但是,在最后添加另一行不会产生完全不挂起的布局。

我试过了:

  • 将第一列的内容替换为new Control(),以测试内容是否过大。
  • 更改内容大小 - >导致更小的内容,更多的空白和相同的问题
  • 更改tableLayoutPanel的大小 - >导致一个较小的控件仍然存在同样的问题
  • 将第一列的大小(后两个具有绝对值)从100%更改为较低的百分比值,自动调整大小和类似的绝对值 - >导致最后一列开始超大,仍然可见滚动条
  • 添加行后
  • PerformLayout()
  • 添加行后
  • Refresh()
  • ResumeLayout(true)强制待处理的布局请求/更改(绝对应该给我我想要的布局并且无需暂停,可能有错误或者被覆盖的东西?)
  • 添加行后
  • Update()

tl; dr添加行,滞后,无滚动条 vs 暂停,添加行,水平滚动条

为什么以及如何不去?

发现没有所有暂停和恢复我遇到同样的问题,如果我添加完全5行:4工作正常,因为不需要滚动条,6删除水平滚动条,5是错误。所以问题比布局暂停更深入。总体上添加指定数量的行肯定有问题。的 - >外包给new question (这个需要) - >解决了外包问题

暂停,直到我偶然发现暂停问题

1 个答案:

答案 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();

即使隐藏父控件也不会阻止用户看到行如何消失,同样在再次显示控件之后,在加载内容本身之前首先显示表边框。所以这个解决方案并不完美,但它的工作范围应该足够了。