.net 查找FlowLayoutPanel的行和列

kulphzqa  于 2023-03-04  发布在  .NET
关注(0)|答案(4)|浏览(171)

只是想知道是否有一种方法可以轻松地查找FlowLayoutPanel中当前的行和列,或者是否需要手动计算?

vyswwuz2

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

wz1wpwve

wz1wpwve2#

上面的例子对我不起作用。它从来没有根据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;
    }

对于相同的控件,不需要使用此方法循环访问控件

ax6ht2ek

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;
}
ee7vknir

ee7vknir4#

下面是一个使用linq计算高度的示例:

var heightNeeded = flowLayoutPanel1.Controls.OfType<Control>()
    .Max(x => x.Location.Y + x.Height) + 7;

相关问题