【问题标题】:How to fix scrollbar showing on TableLayoutPanel?如何修复 TableLayoutPanel 上显示的滚动条?
【发布时间】:2017-12-09 07:47:33
【问题描述】:

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

Msdn 声明 “Add 方法将表格布局重新应用到所有控件”

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

我试过了:

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

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

为什么以及如何不这样做?


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

暂停,直到我再次遇到暂停问题

【问题讨论】:

  • 我可以想到一个hacky快速修复,问题似乎是当你开始添加时垂直滚动条不在这里,所以宽度是错误的。解决方法是在显示垂直滚动条后暂停。不漂亮也不对,但应该可以。
  • @satibel 是否暂停以删除行,然后在添加 if(i==6){ tableLayoutPanel1.ResumeLayout(); } if(i==7){ tableLayoutPanel1.SuspendLayout(); } 并在再次添加所有行后恢复。可悲的是它仍然是一样的,不要问我为什么,它似乎只有几个像素。但是,如果我将上面的代码更改为等到i==15 再次挂起,它就可以工作。添加的每一行似乎几乎没有变化,因此在第六个之后暂停只失败了一些像素,添加的行越多而不暂停,删除的像素就越多?
  • @satibel 测试了更多内容:至少需要添加 6 行而不暂停才能删除水平滚动条。据我所知,这 6 个不一定是前六个,但也可能位于中间的某个位置(上面评论中的证明)。但是总共添加了约 120 行,这 6 行感觉占用了一半的加载时间。恢复添加最后 6 行将防止在添加过程中出现奇怪的冻结,但仍会使控件滞后并花费大量时间。不过谢谢你,如果没有更多的想法/答案,我会利用这个。

标签: c# winforms layout tablelayoutpanel


【解决方案1】:

这个问题与我外包并解决的一个问题here有关,将那里的代码作为主要解决方案,这是一个小补充。

如问题的 cmets 中所述,我必须添加特定数量的行而不暂停(与 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();

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

【讨论】:

    猜你喜欢
    • 2013-03-15
    • 2011-09-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 2013-10-26
    • 2010-11-27
    • 2021-05-16
    • 2012-01-04
    相关资源
    最近更新 更多