Использую WinForms. Мне необходимо добавлять динамически создаваемые панели в другую панель так, чтобы каждая новая находилась ниже ранее добавленной.
Как-то так, но динамически:
1) Создать список для хранения дочерних панелей
List<Panel> childPanels = new List<Panel>();
2) Определить параметры расположения панелей
int panelDx = 5; // расстояние между панелями
int panelDy = 5; // расстояние от боковых границ родительской панели до дочерней
int panelHeight = 20;
3) Определить метод, который будет добавлять панель в родительскую parentPanel
private void AddPanel()
{
int panelCount = childPanels.Count;
childPanels.Add(new Panel()
{
Location = new Point(panelDx, panelDy + panelCount * (panelDy + panelHeight)),
Size = new Size(parentPanel.Width - 2 * panelDx, panelHeight),
BackColor = Color.Black,
}
);
parentPanel.Controls.Add(childPanels[panelCount]);
}
Можно просто получать позицию нижнего края последней панели (свойство Bottom
) и прибавлять к ней нужный отступ. Например:
int y = offset;
if (parentPanel.Controls.Count > 0)
y += parentPanel.Controls[parentPanel.Controls.Count - 1].Bottom;
Это будет работать если панели всегда расположены в том порядке, в котором они были добавлены. Если положение панелей может меняться, то лучше завести отдельную переменную и сохранять в ней ссылку на ту панель, которая в данный момент является нижней.
Также можно вычислить нужную высоту по формуле
y = отступ + индекс * (высота + отступ)
То есть как-то так:
int y = offset + (parentPanel.Controls.Count * (height + offset));
Но этот вариант, естественно, подойдёт только в том случае, если все дочерние панели будут иметь одинаковую высоту.
И, как ещё один вариант, можно просто перебирать все предыдущие панели, суммируя их высоту и отступы:
int y = offset;
foreach (Control c in parentPanel.Controls) y += c.Height + offset;
Этот вариант тоже может подойти, в некоторых случаях. Например, если parentPanel.Controls
содержит не только панели, можно отфильтровать лишние контролы добавив в цикл условие if (c is Panel)
.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Использую библиотеку AngleSharp для работы с сайтомНа сайте стоит защита от частых запросов
Я получаю из БД данные, содержащие уникальные поляМне нужно создать штрих-код для выбранного элемента по уникальному полю в формате code-128...
Решил для себя разобраться с MVVM, не совсем уверен правильно ли я организовал связь между Model и ViewModelХотел бы услышать ваше мнение по поводу...