Поиск строк и столбцов FlowLayoutPanel

#c# #.net #flowlayoutpanel

#c# #.net #flowlayoutpanel

Вопрос:

Просто интересно, есть ли способ легко выполнить поиск строк и столбцов, находящихся в данный момент в FlowLayoutPanel, или требуется вычисление вручную?

Комментарии:

1. В FlowLayoutPanel нет столбцов или строк… Вы имеете в виду TableLayoutPanel?

2. Нет, я использую панель компоновки потока и добавляю элементы управления одинакового размера, и они отображаются в строках и столбцах. Элементы управления, которые я добавляю, являются пользовательскими элементами управления с изображением и меткой, но ограничивающий прямоугольник — это просто квадрат, и все они одинакового размера.

3. Ах, хорошо, дочерние элементы управления в панели FlowLayoutPanel выглядят как строки и столбцы, но панель упорядочивает их слева направо, сверху вниз. Вам нужно будет выполнить вычисления вручную…

4. Если все элементы управления внутри FlowLayoutPanel имеют одинаковый размер, вы могли бы просто взять позицию Y последнего добавленного элемента и разделить ее на высоту элемента (с его запасом).

Ответ №1:

Этот поток старый, но у меня было требование только сегодня, и GetFlowBreak не смог вернуть true для элемента управления, из-за чего панель flow была переведена на новую строку. Я не уверен, почему, и у меня не было времени разобраться в этом. Это работает для 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();
  

HTH!

CT

Ответ №2:

Приведенный выше пример у меня не работал. Он никогда не давал правильного количества строк в зависимости от 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;
    }
  

В случае одинаковых элементов управления вам не нужно перебирать элементы управления с помощью этого метода

Ответ №3:

Я нашел очень простой способ определить это. Вы должны учитывать поля и отступы. Просто так получилось, что я использовал поле равное 2 и отступ 0, поэтому я использовал меньшее значение left location . Все элементы управления с таким небольшим значением для местоположения 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;
}
  

Ответ №4:

Вот пример использования linq для вычисления высоты:

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