【发布时间】: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