我在TableLayoutPanel中看到奇怪的行为,我试图用作垂直堆叠的面板(没有水平滚动条,只有垂直)。
我在这里设置了一个停靠在Form右侧的TableLayoutPanel。我删除了默认创建的额外行和列样式。列样式大小类型将为百分比(100%)。行样式大小类型将是AutoSize。我已将AutoScroll设置为true,将CellBorderStyle设置为Single,因为只有在设置此属性时才会出现此问题。
以下是按钮的相关代码:
private void Button1_Click(System.Object sender, System.EventArgs e)
{
Panel p = new Panel();
p.Dock = DockStyle.Fill;
p.BorderStyle = BorderStyle.FixedSingle;
this.tableLayoutPanel1.Controls.Add(p);
}
private void Button2_Click(System.Object sender, System.EventArgs e)
{
do
{
this.tableLayoutPanel1.PerformLayout();
} while (this.tableLayoutPanel1.HorizontalScroll.Visible);
}
以下是解释此问题的图片。
图片1 - 我点击了Button1一次,将一个完全停靠的面板添加到TableLayoutPanel。
图片2 - 我再点击了Button1四次,获得了5个完全停靠的面板并导致出现水平滚动条。此时,我不明白为什么出现的垂直滚动条没有移过停靠的面板,因此没有水平滚动条。
图片3 - 我点击了Button2一次,导致该循环运行,奇怪的是,每个PerformLayout调用都会使停靠面板的宽度减1,最终导致水平滚动条消失。
问题
为什么在添加第五个面板时会出现水平滚动条?每个面板都停靠,所以我不明白为什么当垂直滚动条出现时它不会导致面板宽度减小垂直滚动条宽度(就像停靠面板应该表现的那样)。
布局引擎发生了什么事,导致它在每次PeformLayout调用后将宽度减少1?我怀疑这是一个与CellBorderStyle属性设置为Single相关的错误。
我的第三个,也是我自己最重要的问题是:获得可靠的垂直堆叠面板的最佳方法是每行有1个控件,其大小完全取决于宽度父容器?解决方案在任何时候都不应出现水平滚动条。最好是开箱即用型解决方案(无自定义控件)。