TableLayoutPanel имеет неправильную высоту строки

У меня есть макет таблицы 2x2 с автоматическим размером и длинные метки с автоматическим размером в каждой ячейке. Этот макет находится в другом макете таблицы без ячеек с автоматическим размером. Минимальный проект для воспроизведения проблемы:

using System;
using System.Windows.Forms;

namespace TestForms {
    static class Program {
        [STAThread]
        static void Main() {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new TestForm());
        }
    }

    class TestForm : Form {
        public TestForm() {
            var childPanel = new TableLayoutPanel();
            var label8 = new Label();
            var label9 = new Label();
            var label10 = new Label();
            var label7 = new Label();
            var rootPanel = new TableLayoutPanel();

            childPanel.AutoSize = true;
            childPanel.AutoSizeMode = AutoSizeMode.GrowAndShrink;
            childPanel.BackColor = System.Drawing.Color.Silver;
            childPanel.ColumnCount = 2;
            childPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            childPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 50F));
            childPanel.Controls.Add(label8, 1, 0);
            childPanel.Controls.Add(label9, 0, 1);
            childPanel.Controls.Add(label10, 1, 1);
            childPanel.Controls.Add(label7, 0, 0);
            childPanel.Dock = DockStyle.Top;
            childPanel.RowCount = 2;
            childPanel.RowStyles.Add(new RowStyle());
            childPanel.RowStyles.Add(new RowStyle());

            label8.AutoSize = true;
            label8.Text = "2ggggggggggggggggg";

            label9.AutoSize = true;
            label9.Text = "label9";

            label10.AutoSize = true;
            label10.Text = "label10";

            label7.AutoSize = true;
            label7.Text = "label7";

            rootPanel.ColumnCount = 1;
            rootPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
            rootPanel.Controls.Add(childPanel, 0, 0);
            rootPanel.Dock = DockStyle.Fill;
            rootPanel.RowCount = 1;
            rootPanel.RowStyles.Add(new RowStyle(SizeType.Percent, 100F));

            ClientSize = new System.Drawing.Size(205, 197);
            Controls.Add(rootPanel);
        }
    }
}

Я получаю следующий результат:

Скриншот

Почему последняя строка имеет неправильную высоту? Есть ли обходной путь?


person Dem0n13    schedule 09.04.2016    source источник


Ответы (1)


Интересно, похоже, что вы столкнулись с какой-то ошибкой, поскольку этого не происходит, если некоторые из меток AutoSize являются false, или стиль первого столбца SizeType.AutoSize и т. д.

Вы можете использовать следующий обходной путь. Это некрасиво, но это единственный способ, который я нашел. Идея состоит в том, чтобы добавить невидимую строку, содержащую фальшивые Label с AutoSize, установленными на false. Например, после настройки обычного макета добавьте следующие строки:

childPanel.RowCount++;
childPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 0));
childPanel.Controls.Add(new Label { AutoSize = false }, 0, childPanel.RowCount - 1);
person Ivan Stoev    schedule 09.04.2016