Вычислите точные размеры панели (включая внутренние) для использования в Custom ScrollBar

Подскажите пожалуйста, как узнать внутренние размеры панели, которые скрыты от глаз пользователя, если элементов много, и свойство AutoScroll = false.

На скрине указана цифра - она получена "случайно", в проекте все подписано.

введите сюда описание изображения

При получении координат последнего внутреннего элемента, полученное значение в разы меньше того значения, которое используется, чтобы добраться до этого элемента.

введите сюда описание изображения

public Form_Main() {
        InitializeComponent();

        flp_Elements.MouseWheel += Flp_Els_MouseWheel;
    }

    // Scrolling the panel (Flp_Els) with the mouse wheel
    private void Flp_Els_MouseWheel(object sender, MouseEventArgs e) {
        int step = customScrollBar1.Value -= e.Delta > 0 ? customScrollBar1.SmallStep : -customScrollBar1.SmallStep;
        customScrollBar1.Value = Math.Max(customScrollBar1.Minimum, Math.Min(step, customScrollBar1.Maximum));

        ScrollValue = (int)customScrollBar1.Value;
    }

    // Scroll the panel (Flp_Els) with the slider on the ScrollBar
    private void customScrollBar1_ValueChanged(object sender, EventArgs e) {
        ScrollValue = customScrollBar1.Value;
    }

    // Метод переопределения максимального значения, при добавлении элементов на панель
    private void flp_Elements_ControlAdded(object sender, ControlEventArgs e) {
        // Получилось прокрутить дальше (3820) max - дальше не двигается,
        // но число максимума больше указанного выше

        // ! КАК ПОЛУЧИТЬ РАЗМЕРЫ ПАНЕЛИ, КОГДА ОНА НАПОЛНЯЕТСЯ ЭЛЕМЕНТАМИ И СКРЫВАЕТ ИХ

        customScrollBar1.Maximum = flp_Elements.VerticalScroll.Maximum + flp_Elements.VerticalScroll.LargeChange * 8;
        flp_Elements.VerticalScroll.Maximum = customScrollBar1.Maximum;
    }

    // БЕЗ ЭТОГО СОДЕРЖИМОЕ ПАНЕЛИ НЕ ДВИГАЛОСЬ
    // Установка пределов для панели
    public int scrollValue = 0;
    public int ScrollValue {
        get { return scrollValue; }
        set {
            scrollValue = value;

            // Minimum = 0 - все в пиклелях
            if (scrollValue < 0) scrollValue = 0;

            // Maximum - все в пиклелях
            if (scrollValue > flp_Elements.VerticalScroll.Maximum)
                scrollValue = flp_Elements.VerticalScroll.Maximum;

            flp_Elements.VerticalScroll.Value = scrollValue;
        }
    }
}

На данный момент: панель прокручивается с помощью ScrollBar, но чтобы все работало правильно нужно это самое число. Пробовал разные варианты, но они не работают, как нужно:

  1. Первый вариант
  2. Второй вариант (описан в разделе "Calculations"

Ответы (1 шт):

Автор решения: Ilya
private void flp_Container_ControlAdded(object sender, ControlEventArgs e) {
    flp_Container.VerticalScroll.Maximum = flp_Container.GetPreferredSize(flp_Container.Size).Height - flp_Container.Size.Height;
    VScrolBar1.Maximum = flp_Container.VerticalScroll.Maximum;           
}
→ Ссылка