TableLayoutPanel новые столбцы строк, не соответствующие заданному размеру

#c# #winforms #tablelayoutpanel

Вопрос:

У меня есть панель TableLayoutPanel с 5 столбцами.

Ширина столбцов была установлена на фиксированные значения, чтобы соответствовать их содержимому.

У меня есть кнопка добавить строку со следующим кодом:

     private void addrowButton_Click(object sender, EventArgs e)
    {
        RowStyle temp = configTLP.RowStyles[configTLP.RowCount - 1];
        configTLP.RowCount  ;
        configTLP.RowStyles.Add(new RowStyle(temp.SizeType, temp.Height));
        configTLP.Controls.Add(new TextBox(), 0, configTLP.RowCount - 1);
        configTLP.Controls.Add(new TextBox(), 1, configTLP.RowCount - 1);
        configTLP.Controls.Add(new ComboBox(), 2, configTLP.RowCount - 1);
        configTLP.Controls.Add(new TextBox(), 3, configTLP.RowCount - 1);
        configTLP.Controls.Add(new Button(), 4, configTLP.RowCount - 1);
    }
 

При нажатии только первый, третий и пятый столбцы сохраняют свой размер, как показано на скриншоте ниже.

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

Настройки панели TableLayoutPanel:

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

Комментарии:

1. Вы забыли добавить configTLP.SuspendLayout(); configTLP.Controls.Add(...) [...] configTLP.ResumeLayout(true); и закрепить новые элементы управления (например, configTLP.Controls.Add(new TextBox() { Dock = DockStyle.Fill}, 0, configTLP.RowCount - 1); ).

2. Кстати, похоже, что вы могли бы использовать DataGridView вместо панели TableLayoutPanel.

3. @Jimi вы уверены, что TableLayoutPanel чтит SuspendLayout? Он не переопределяет OnLayoutSuspended, и я не вижу никакого влияния на пользовательский интерфейс.

4. @Steeeve SuspendLayout на самом деле здесь не имеет значения. Это там (как обычно), чтобы следовать стандартной реализации. Что имеет значение в ScrollableControl, который также является поставщиком IExtenderProvider, так это вызов PerformLayout() (так или иначе). Возможно, вы не считаете , что это необходимо во всех ситуациях, но этот элемент управления участвует в макете, поэтому вы обычно пытаетесь создать поведение по умолчанию. Это также применяется в Конструкторе.

5. @Steeeve Со стандартной реализацией и попытайтесь сгенерировать поведение по умолчанию , обратитесь к внутреннему счетчику, который связывает пары SuspendLayout() и PerformLayout() звонки ( ResumenLayout(true) также звонки PerformLayout() ), чтобы вы не выходили из синхронизации (есть своего рода проверка, которая должна справиться с этим, но…). Не имеет значения, используется ли LayoutEngine по умолчанию.

Ответ №1:

Добавление { Dock = DockStyle.Fill} решило проблему.

 private void addrowButton_Click(object sender, EventArgs e)
{
    RowStyle temp = configTLP.RowStyles[configTLP.RowCount - 1];
    configTLP.RowCount  ;
    configTLP.RowStyles.Add(new RowStyle(temp.SizeType, temp.Height));
    configTLP.Controls.Add(new TextBox() { Dock = DockStyle.Fill}, 0, configTLP.RowCount - 1);
    configTLP.Controls.Add(new TextBox() { Dock = DockStyle.Fill}, 1, configTLP.RowCount - 1);
    configTLP.Controls.Add(new ComboBox() { Dock = DockStyle.Fill}, 2, configTLP.RowCount - 1);
    configTLP.Controls.Add(new TextBox() { Dock = DockStyle.Fill}, 3, configTLP.RowCount - 1);
    configTLP.Controls.Add(new Button() { Dock = DockStyle.Fill}, 4, configTLP.RowCount - 1);
}