16

我有 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

4

5 回答 5

54

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

  • 设置您的 TableLayoutPanel 属性如下:
    • Dock = DockStyle.Top
    • 自动尺寸 = 真
    • AutoSizeMode = AutoSizeMode.GrowAndShrink
    • 自动滚动 = 假。
  • 将您的 TableLayoutPanel 放入具有属性的面板中:
    • Dock = DockStyle.Fill
    • 自动滚动 = 真
    • 自动尺寸 = 假。
于 2014-09-01T07:50:43.703 回答
2

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

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

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

于 2013-03-25T17:29:05.150 回答
1

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

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

    tableLayoutPanel1.AutoScroll = False
    tableLayoutPanel1.AutoScroll = True
于 2020-09-17T18:35:27.097 回答
0

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

于 2013-03-26T08:22:14.573 回答
0

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

if (tableLayoutPanel.RowCount < 15)
{
    panel1.AutoScroll = false;
}
else
{
     panel1.AutoScroll = true;
}
于 2017-09-01T16:08:59.310 回答