Добавление элементов ниже других

123
05 мая 2019, 18:40

Использую WinForms. Мне необходимо добавлять динамически создаваемые панели в другую панель так, чтобы каждая новая находилась ниже ранее добавленной.
Как-то так, но динамически:

Answer 1

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]);
    }
Answer 2

Можно просто получать позицию нижнего края последней панели (свойство 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).

READ ALSO
Очистка данных о посещении сайта AngleSharp

Очистка данных о посещении сайта AngleSharp

Использую библиотеку AngleSharp для работы с сайтомНа сайте стоит защита от частых запросов

151
Создание штрих-кода и его печать C#

Создание штрих-кода и его печать C#

Я получаю из БД данные, содержащие уникальные поляМне нужно создать штрих-код для выбранного элемента по уникальному полю в формате code-128...

137
Критика кода. MVVM, WPF, C#

Критика кода. MVVM, WPF, C#

Решил для себя разобраться с MVVM, не совсем уверен правильно ли я организовал связь между Model и ViewModelХотел бы услышать ваше мнение по поводу...

145
Для чего нужны свойства?

Для чего нужны свойства?

Допустим есть это:

134