我一直在控制面板上的“中断”问题。但是,当我手动开始调整表单大小时,每次调整大小后,缺少的控件都会重新出现。 我创建了一个测试应用程序来显示此问题。 该应用程序本身会在主窗体上添加一个面板。 在此面板中,我添加了10个分组框,每个分组框都有100个标签。 以下是创建测试应用并重现问题的步骤(到目前为止,我仅在.NET 4.6.1和Visual Studio 2017中尝试过此步骤)
将默认表单的构造函数更新为以下形式
public Form1()
{
InitializeComponent();
// My stuff
var panContents = new Panel();
panContents.AutoScroll = true;
panContents.AutoSize = true;
panContents.AutoSizeMode = AutoSizeMode.GrowAndShrink;
panContents.Dock = DockStyle.Fill;
for (int g = 10; g >= 0; g--)
{
var groupBox = new GroupBox();
groupBox.AutoSize = true;
groupBox.AutoSizeMode = AutoSizeMode.GrowOnly;
groupBox.Dock = DockStyle.Top;
groupBox.Text = "Group " + g;
var mainPanel = new Panel();
mainPanel.Dock = DockStyle.Fill;
mainPanel.AutoSize = true;
mainPanel.AutoSizeMode = AutoSizeMode.GrowOnly;
for (int i = 100; i >= 0; i--)
{
var con = new Label();
con.Text = "Label " + i;
con.Height = 100;
con.Dock = DockStyle.Top;
mainPanel.Controls.Add(con);
}
groupBox.Controls.Add(mainPanel);
panContents.Controls.Add(groupBox);
}
this.Controls.Add(panContents);
}
运行项目(不调整表单大小)
任何人都知道为什么会这样吗?我认为可能与面板尺寸的限制有关。但是,如果是这种情况,我不希望调整窗体的大小以开始显示这些缺少的控件。
PS我知道我可以通过使用制表符或分页来解决此问题。但是我想知道为什么我看到自己的行为(理想情况下我想避免使用制表符或分页)
答案 0 :(得分:0)
@是,
这是一个相当有趣的问题-在加载/运行代码之前还不太了解它。我碰巧同意Jimi的看法,即您可能会遇到内部限制,但是这种限制似乎很奇怪。正如您所指出的那样,调整表单的高度/宽度不应克服限制。因此,无论内部发生什么,这都是有点奇怪和意外的事情。
但是我为您提供了一个解决方案:诚然,这是一种麻烦,但有时这是我们唯一的选择。如果您的项目规格需要一种与您提出的形式一样的形式,即最终高度值超过100,000的形式,则此解决方案应符合要求。
将以下代码添加到Form1初始化代码的末尾,如原始文章中所示(请参见下文)。我所做的只是以编程方式“微调”了表格的高度,直到所有面板都完全渲染为止。我认为这将是您最好的选择。
记录下来,我花了很多时间。我在各种控件,DoEvents()等上尝试了Refresh()的各种组合,但均无济于事。我什至尝试不使用停靠和自动调整大小,而是手动设置顶部和高度(这也不起作用)。因此,除了Microsoft提供的修复程序,我认为下面的代码确实是解决此问题的唯一方法。
**为使下面的代码起作用,请在代码的InitializeComponent()之后立即添加此行;行:
this.Show();
然后在代码的右大括号后添加此代码:
// fix the panContents panel
long currentMaximum = 0;
while (true)
{
var preserveHeight = this.Height;
// tweak the height
this.Height += 1;
// set it back the height
this.Height = preserveHeight;
// test to see if the scroll bar max remains at its previous value
// if it does, we're done
if (currentMaximum == panContents.VerticalScroll.Maximum)
break;
// otherwise, preserve the current maximum scroll bar position
currentMaximum = panContents.VerticalScroll.Maximum;
// now scroll to the bottom of the panel
panContents.VerticalScroll.Value = panContents.VerticalScroll.Maximum;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();
}
// scroll to the top
panContents.VerticalScroll.Value = 0;
// necessary step to ensure scroll bar value is set
panContents.PerformLayout();