TableLayoutPanel 显示垂直滚动

Posted

技术标签:

【中文标题】TableLayoutPanel 显示垂直滚动【英文标题】:TableLayoutPanel displays vertical scroll 【发布时间】:2013-03-15 06:25:23 【问题描述】:

我有 TableLayoutPanel 用于动态创建 AutoScroll = true 的控件。添加新控件时它工作正常。但是当我删除并且所有控件都可见时,垂直滚动是可见的。 这里有一些截图:

预期/正确的滚动可见性:

可见性不正确:

有什么想法吗?

更新: 这是一些代码

tableLayoutPanel1.SuspendLayout();
tableLayoutPanel1.RowCount = 0;
tableLayoutPanel1.RowStyles.Clear();
tableLayoutPanel1.AutoScroll = true;
tableLayoutPanel1.Padding = new Padding(0, 0, SystemInformation.VerticalScrollBarWidth, 0);
foreach (var item in objects)

     tableLayoutPanel1.RowCount++;
     tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
     tableLayoutPanel1.Controls.Add(CreateNewItem(item));
 

 tableLayoutPanel1.RowCount++;
 tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
 tableLayoutPanel1.Controls.Add(CreateAddButton());

 tableLayoutPanel1.ResumeLayout();

及删除代码

tableLayoutPanel1.SuspendLayout();
tableLayoutPanel1.Controls.Remove(item);
tableLayoutPanel1.RowStyles.RemoveAt(0);
tableLayoutPanel1.RowCount--;
tableLayoutPanel1.ResumeLayout();

AutoSize 为 true,AutoSizeMode 为 GrowAndShrink

【问题讨论】:

当您删除控件时,您是否也删除了行? @LarsTech 是的。最后一行有 AutoSize 样式,但看起来像 Percent。 @LarsTech,我添加了代码。 .Net Framework 4.8 这个bug依然存在 【参考方案1】:

问题涉及TableLayoutPanel scrolling。 您必须使用 Panel 而不是 TableLayoutPanel 进行滚动。 这是解决此问题的示例(用于垂直滚动):

如下设置您的 TableLayoutPanel 属性: Dock = DockStyle.Top AutoSize = true AutoSizeMode = AutoSizeMode.GrowAndShrink AutoScroll = false。 将您的 TableLayoutPanel 放入具有属性的面板中: Dock = DockStyle.Fill 自动滚动 = 真 AutoSize = 假。

【讨论】:

7 年后,这仍然是一个有效的解决方案。但是为什么需要在 TableLayoutPanel 上设置 DockStyle.Top(而不是 Fill)?没有它,凭经验,它是行不通的——但我不明白其中的逻辑。 如果设置 DockStyle.Fill,TableLayoutPanel 的尺寸将与其父级相同,因此 Panel 永远不会显示滚动条。 这就是为什么我如此。在需要的时候这是多么黄金的答案。【参考方案2】:

当您删除动态控件时,您需要删除在添加过程中插入的额外行并将表格布局面板高度重新调整为小于滚动容器高度。

在添加过程中,表格布局面板的高度会增加,这由滚动容器处理;但是当您删除控件时,表格布局面板的高度不会降低它的高度以适合滚动容器。

执行此操作的一种方法是为行提供固定高度并将表格布局面板占用设置为“自动”。

【讨论】:

每一行都有 AutoSize 样式,tableLayoutPanel.AutoSize 为真【参考方案3】:

最简单和最有趣的解决方案之一就是禁用和启用 tableLayoutPanel1.AutoScroll

在您的删除程序代码的末尾添加这些代码:

    tableLayoutPanel1.AutoScroll = False
    tableLayoutPanel1.AutoScroll = True

【讨论】:

【参考方案4】:

我将 tableLayoutPanel 插入到 XtraScrollableControl(Devexpress 控件)。 tableLayoutPanel.Dock 设置为 Top,XtraScrollableControl.Dock 设置为 Fill。这个解决方案没有解决这个问题,但我得到了我需要的行为。

【讨论】:

【参考方案5】:

我计算了 TableLayoutPanel 中的行数,看看有多少行适合。低于我为添加和删除方法设置 AutoScroll = false 的量。卷轴将出现在大集合上,而在小集合上消失。

if (tableLayoutPanel.RowCount < 15)

    panel1.AutoScroll = false;

else

     panel1.AutoScroll = true;

【讨论】:

以上是关于TableLayoutPanel 显示垂直滚动的主要内容,如果未能解决你的问题,请参考以下文章

TableLayoutPanel

禁用 TableLayoutPanel 行自动缩放

word 中水平滚动条与垂直滚动条怎样设置与取消??

CSS - 溢出:滚动; - 总是显示垂直滚动条?

如何强制显示垂直滚动条? [复制]

垂直菜单导航 - 菜单滚动时不显示子菜单