只是想知道是否有一种方法可以轻松地查找FlowLayoutPanel中当前的行和列,或者是否需要手动计算?
vyswwuz21#
这个线程是旧的,但是我今天才有这个要求,GetFlowBreak在一个控件上没有返回true,导致流面板中断到一个新行。我不知道为什么,我没有时间去弄清楚。这对FlowDirection = LeftToRight有效。坦率地说,我没有时间写这个,但我无论如何都要写。下面是一个简单的扩展方法,它将计算行数:
public static int GetRowCount(this FlowLayoutPanel flowPanel) { int rows = 1; int rowWidth = flowPanel.ClientRectangle.Width; foreach (Control control in flowPanel.Controls) { rowWidth -= control.Width; if (rowWidth > 0) { continue; } rows += 1; rowWidth = flowPanel.ClientRectangle.Width; } return rows; }
用途:
int rows = ChoiceFlow.GetRowCount();
啊!CT
wz1wpwve2#
上面的例子对我不起作用。它从来没有根据FlowLayoutPanel的大小给出正确的行数。所以我更新了上面的解决方案。假设FlowLayoutPanel中的所有控件都具有相同的大小:
FlowLayoutPanel
FlowLayoutPanel flp = new FlowLayoutPanel(); private int GetRowCount() { int rows; int Col = (flp.ClientRectangle.Width - flp.Padding.Left - flp.Padding.Right) / (flp.Controls[0].Width + flp.Controls[0].Margin.Left + flp.Controls[0].Margin.Right); rows = flp.Controls.Count / Col; if (flp.Controls.Count % Col != 0) rows += 1; return rows; } private int GetFlowHeight() { if (flp.Controls.Count == 0) return 0; int h = ((flp.Controls[0].Height + flp.Controls[0].Margin.Top + flp.Controls[0].Margin.Bottom) * GetRowCount()) + flp.Padding.Top + flp.Padding.Bottom; return h; }
对于相同的控件,不需要使用此方法循环访问控件
ax6ht2ek3#
我发现了一个非常简单的方法来确定这一点。你必须考虑到边距和填充。我只是碰巧使用了边距为2和填充为0,所以我使用了一个较小的左位置值。任何具有该小值的X位置的控件将紧挨着flowlayout面板的左侧。如果你想计算顶部控件的数量,只需检查Y位置值。
public int GetRowCount(FlowLayoutPanel flowPanel) { int rows = 0; foreach (Control cntrl in flowPanel.Controls) { if (cntrl.Location.X < 2) // Allow for a small margin or padding { rows += 1; } } return rows; }
ee7vknir4#
下面是一个使用linq计算高度的示例:
var heightNeeded = flowLayoutPanel1.Controls.OfType<Control>() .Max(x => x.Location.Y + x.Height) + 7;
4条答案
按热度按时间vyswwuz21#
这个线程是旧的,但是我今天才有这个要求,GetFlowBreak在一个控件上没有返回true,导致流面板中断到一个新行。我不知道为什么,我没有时间去弄清楚。这对FlowDirection = LeftToRight有效。
坦率地说,我没有时间写这个,但我无论如何都要写。下面是一个简单的扩展方法,它将计算行数:
用途:
啊!
CT
wz1wpwve2#
上面的例子对我不起作用。它从来没有根据
FlowLayoutPanel
的大小给出正确的行数。所以我更新了上面的解决方案。假设
FlowLayoutPanel
中的所有控件都具有相同的大小:对于相同的控件,不需要使用此方法循环访问控件
ax6ht2ek3#
我发现了一个非常简单的方法来确定这一点。你必须考虑到边距和填充。我只是碰巧使用了边距为2和填充为0,所以我使用了一个较小的左位置值。任何具有该小值的X位置的控件将紧挨着flowlayout面板的左侧。如果你想计算顶部控件的数量,只需检查Y位置值。
ee7vknir4#
下面是一个使用linq计算高度的示例: