Ошибка высоты FlowLayoutPanel при использовании AutoSize - PullRequest
4 голосов
/ 04 октября 2011

У меня есть форма, содержащая TableLayout с 1 столбцом и 3 строками, который содержит 2 FlowLayoutPanels и текстовое поле. Все строки имеют авторазмер, а для столбца установлено значение «Процент = 100%».

Каждая FlowLayoutPanel содержит несколько текстовых блоков. Панели FlowLayout установлены: LeftToRight, AutoSize = true, GrowAndShrink, Docking = Fill.

Схема:

Form
    TableLayout (Dock=Fill)
        FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
           More controls
        FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
           More controls
        TextBox(Dock=Fill, MultiLine=true)

Проблема заключается в том, что если я поместил FlowLayoutPanel внутри GroupBox, для которого также установлено значение AutoSize = true, высота FlowLayoutPanel установлена ​​неправильно, и он показывает TextBoxes в 1 строке, вырезая некоторые TextBoxes из формы.

Схема:

Form
    TableLayout (Dock=Fill)
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
               More controls
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
               More controls
        TextBox(Dock=Fill, MultiLine=true)

Кстати, то же самое происходит, если я использую вместо GroupBox, Panel или даже UserControl для хранения FlowLayoutPanel.

Кстати, это происходит даже без TableLayout. Я попытался поместить GroupBox (с FlowLayoutPanel) в авторазмерную форму, и я получил то же поведение.

Я думаю, что проблема в том, что когда FlowLayoutPanel находится в другом контейнере, который также имеет авторазмер, он не может перейти в свой контейнер предпочтительного размера.

Что можно сделать, чтобы переопределить эту ошибку ??

Пожалуйста, помогите Спасибо, Йорам


p.s: Я должен использовать GroupBox, чтобы иметь красивую рамку вокруг TextBoxes.

Ответы [ 2 ]

2 голосов
/ 13 июня 2012

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

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

, поэтому в приведенном выше примере итоговый макет будет:

Form
    TableLayout (Dock=Fill)
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
                Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
                More controls
        GroupBox (Dock=Fill, AutoSize=True, GrowShrink) 
            FlowLayoutPanel(Dock=Fill, AutoSize=True, GrowShrink)
                Panel(Dock=Fill, Height = 1, MinimumSize = new System.Drawing.Size( Form.ClientSize.Width - TableLayout.Padding.Horizontal, 1))
                More controls
        TextBox(Dock=Fill, MultiLine=true)

Надеюсь, это поможет.

2 голосов
/ 05 октября 2011

Когда вы ставите FlowLayoutPanel в GroupBox (или другие контейнеры), вы также можете оставить их AutoSize=false.Я не уверен, но это может сделать групповой блок «ведущим» элементом управления, когда дело доходит до размеров.


Редактировать (после вашего комментария)

«Ведущий контроль» - мои слова, пытающиеся выразить, что размер группового блока будет определять размер FLP, это не какой-то официальный термин.Проблема в том, что стыковка и автоматическое изменение размеров ведут борьбу друг с другом по своей природе , и кто-то должен взять на себя контроль.Это может быть сделано только тогда, когда стыковка и автоматическое изменение размеров сокращены, и путем программирования событий изменения размера самостоятельно.

После небольшой игры я наконец-то придумал эту модель:

Form
    TableLayout (Dock=Fill)
        GroupBox () 
            FlowLayoutPanel(Dock=Fill)
               More controls

Иизменить размер события:

private void Form1_Resize(object sender, EventArgs e)
{
    this.SuspendLayout();
    this.groupBox.Width = this.Width - 20;
    this.groupBox.Height = 
        this.flowLayoutPanel.GetPreferredSize(this.groupBox.Size).Height + 20;
    this.ResumeLayout();
}

Надеюсь, я вас хорошо понял.По крайней мере, это может указать вам правильное направление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...