TableLayoutPanel显示垂直滚动

时间:2013-03-25 16:54:27

标签: c# scrollbar tablelayoutpanel vertical-scrolling vertical-scroll

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

预期/纠正滚动可见性:

enter image description here

不正确的可见性:

enter image description here

有什么想法吗?

更新: 这是一些代码

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

5 个答案:

答案 0 :(得分:32)

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

  • 设置TableLayoutPanel属性如下:
    • Dock = DockStyle.Top
    • AutoSize = true
    • AutoSizeMode = AutoSizeMode.GrowAndShrink
    • AutoScroll = false。
  • 将您的TableLayoutPanel放入具有属性的Panel中:
    • Dock = DockStyle.Fill
    • AutoScroll = true
    • AutoSize = false。

答案 1 :(得分:2)

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

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

一种方法是为行提供固定高度,并将表格布局面板设置为“自动”。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我计算了TableLayoutPanel中的行数,看看有多少行适合。在适合的数量之下,我为添加和删除方法设置了AutoScroll = false。滚动将显示为大集,并在小集上消失。

if (tableLayoutPanel.RowCount < 15)
{
    panel1.AutoScroll = false;
}
else
{
     panel1.AutoScroll = true;
}

答案 4 :(得分:0)

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

在“删除过程”代码的末尾添加以下代码:

    tableLayoutPanel1.AutoScroll = False
    tableLayoutPanel1.AutoScroll = True