#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;