动态内容的自动滚动 Windows 表单

Auto Scrolling Windows Form for Dynamic Content

我正在开发 C# .NET 3.5 桌面应用程序。在软件中我有一个Form,其中包含一个TableLayoutPanel tp1tp1 的第二行包含一个 GroupBoxGroupBox 包含另一个 TableLayoutPanel tp2tp2 将在运行时动态增长。

Form
-----------------------------
|  TableLayoutPanel tp1      |
|____________________________|
|    GroupBox                |
|    ________________________|
|   |                        |
|   |  TableLayoutPanel tp2  |
|   |  ______________________|
|   | |                      |
|   | |   Dynamic content    |
|   | |        here          |
|   | |                      |
|   | |______________________|
|   |________________________|
|                            |
|____________________________|
-----------------------------

Form 的 AutoScroll 为真。

tp1 的第 2 行的 SizeType 是 AutoSize。

GroupBox 的 AutoSize 为真。

tp2 的 AutoSize 为真。 tp2通过以下代码动态更新:

tp2.RowCount = tp2.RowCount + 1;
tp2.RowStyles.Add(new RowStyle(SizeType.AutoSize));

GroupBox gb = new GroupBox();
gb.BackColor = Color.Red;
tp2.Controls.Add(gb, 0, tp2.RowCount - 1);

tp1 大于 window 大小时,我希望在 Form 中显示滚动条。但是没有出现滚动条。

如果我将 tp1 的 AutoScroll 设置为 true,我可以用同样的方式激活滚动条。但我想要 Form 上的滚动条,而不是 tp1.

我怎样才能做到这一点?

您需要使用设计器或代码进行此类设置:

var panel1 = new TableLayoutPanel();
panel1.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
panel1.RowCount = 2;
panel1.RowStyles.Add(new RowStyle(SizeType.Absolute, 20));
panel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
panel1.AutoSize = true;
panel1.AutoSizeMode= System.Windows.Forms.AutoSizeMode.GrowAndShrink;

var groupBox1 = new GroupBox() { Text = "GroupBox" };
groupBox1.AutoSize = true;
groupBox1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;

var panel2 = new TableLayoutPanel() {Top= 24, Left= 5 };
panel2.CellBorderStyle = TableLayoutPanelCellBorderStyle.Single;
panel2.AutoSize = true;
panel2.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;

groupBox1.Controls.Add(panel2);

panel1.Controls.Add(new Label() { Text = "Label" });
panel1.Controls.Add(groupBox1);

this.SuspendLayout();
this.Controls.Add(panel1);
this.AutoScroll = true;
for (int i = 0; i < 10; i++)
{
    panel2.RowCount += 1;
    panel2.RowStyles.Add(new RowStyle(SizeType.AutoSize));
    panel2.Controls.Add(new GroupBox()
    {
        Text = string.Format("GroupBox{0}", i + 1)
    });
}
this.ResumeLayout(true);

这将是结果: