我有一个包含1列和3行的TableLayout的表单,其中包含2 FlowLayoutPanels和一个文本框。所有行都是AutoSize,列被设置为Percentage=100%。
每个FlowLayoutPanel包含几个TextBoxes。FlowLayoutPanels设置为: LeftToRight、AutoSize=true、GrowAndShrink、Docking=Fill。
大纲是:
Form
TableLayout (Dock=Fill)
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
More controls
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
More controls
TextBox(Dock=Fill, MultiLine=true)问题是,如果我将FlowLayoutPanel放置在一个也被设置为AutoSize=true的GroupBox中,那么FlowLayoutPanel的高度将不能正确设置,并且它会在一行中显示TextBoxes,将一些TextBoxes从表单中删除。
大纲是:
Form
TableLayout (Dock=Fill)
GroupBox (Dock=Fill, AutoSize=True, GrowShrink)
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
More controls
GroupBox (Dock=Fill, AutoSize=True, GrowShrink)
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
More controls
TextBox(Dock=Fill, MultiLine=true)顺便说一句,如果我使用GroupBox、面板甚至UserControl来保存FlowLayoutPanel,也会发生同样的事情。
顺便说一句,即使没有TableLayout,也会发生这种情况。我尝试将GroupBox (与FlowLayoutPanel一起)放置在AutoSized表单上,并得到了相同的行为。
我认为问题在于,当FlowLayoutPanel位于另一个也是AutoSized的容器中时,它不能传递给它的容器是首选大小。
怎样才能覆盖这个bug??
谢谢你,约兰
p.s:我必须使用GroupBox在TextBoxes周围有一个很好的框架。
发布于 2012-06-13 05:57:18
也遇到了这个问题,并试图找出如何轻易解决这一问题。尽管@GertArnold的回答确实有帮助,但它觉得有点麻烦,于是我寻找了另一个解决方案。
我发现Flow Panel的自动大小逻辑正在处理“最小”要求,通过添加一个最小高度的空白面板,我能够强制Flow Panel的宽度,从而使所有其他子控件都可见。
因此,在上面的示例中,最终的布局是:
Form
TableLayout (Dock=Fill)
GroupBox (Dock=Fill, AutoSize=True, GrowShrink)
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
More controls
GroupBox (Dock=Fill, AutoSize=True, GrowShrink)
FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
More controls
TextBox(Dock=Fill, MultiLine=true)希望这能有所帮助。
发布于 2011-10-04 21:13:04
当您将FlowLayoutPanel停靠在GroupBox (或其他容器)中时,您最好离开它们的AutoSize=false。我不确定,但这可能会使groupbox在调整大小时成为“领先”控件。
编辑(在您的评论之后)
‘引导控制’是我的话,试图表达的群盒大小将决定的FLP,这不是什么官方术语。问题是,对接和自动大小是天生就互相争斗,有人应该采取,嗯,控制。这只能在减少对接和自动调整大小以及自己编程调整大小事件时才能完成。
在玩了一会儿之后,我终于想出了一个模型:
Form
TableLayout (Dock=Fill)
GroupBox ()
FlowLayoutPanel(Dock=Fill)
More controls以及调整大小事件:
private void Form1_Resize(object sender, EventArgs e)
{
this.SuspendLayout();
this.groupBox.Width = this.Width - 20;
this.groupBox.Height =
this.flowLayoutPanel.GetPreferredSize(this.groupBox.Size).Height + 20;
this.ResumeLayout();
}希望我能很好地理解你。至少这可能会给你指明正确的方向。
发布于 2019-10-08 09:31:28
很抱歉迟到了,但是我想建议您最好简单地计算FlowLayoutPanels及其父级的高度,而不是使用格特·阿诺德的回答作为他的方法,使GetPreferredSize()在删除子Control时返回一个Height等于“单行”--即使仍然需要两行(至少在我的情况下)。
public YodaUserControl
{
InitializeComponent();
InitialHeight = parentOfFlp.Height;
}
private int InitialHeight { get; }
private void OnAdded(object sender, ControlEventArgs args)
=> RefreshHeight();
private void OnRemoved(object sender, ControlEventArgs args)
=> RefreshHeight();
private void OnSizeChanged(object sender, EventArgs args)
=> RefreshHeight();
private void RefreshHeight()
{
if (flpYoda.Controls.Count > 1
&& flpYoda.Controls[0] is Control control)
{
parentOfFlpYoda.Height = flpYoda.Height =
InitialHeight * (int)Math.Ceiling(
flpYoda.Controls.Count / Math.Floor(
flpYoda.ClientSize.Width / (double)control.Width));
}
}备注:
YodaUserControl、parentOfFlpYoda和flpYoda。OnAdded、OnRemoved和OnSizeChanged需要附加到flpYoda的相应ControlAdded、ControlRemoved和SizeChanged事件。如果您需要进一步的帮助,请通过评论告诉我。
https://stackoverflow.com/questions/7647244
复制相似问题