#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);
}