Автоматическое позиционирование вложенных пользовательских элементов управления
Я хочу, чтобы изменить размеры некоторых сгенерированных элементов управления. Я создаю два TextBox
типы и два CustomControl
типы, которые являются типом UserControl
, каждый CustomControl
имеет Label
это отображает строку, которую я называю заголовком. Я вижу только одно из двух текстовых полей. Я вижу только одну из двух подписей. Как я могу отобразить все элементы управления в форме? Я предпочитаю не управлять контрольной позицией самостоятельно. Скорее придерживайтесь Dock
Настройки.
public partial class SomeForm : Form
{
public SomeForm()
{
InitializeComponent();
LoadControls();//I can only see the first control caption and textBox2
//how can I display both textboxes and both captions?
}
private void LoadControls()
{
TextBox textBox = GenerateTextBox("First textbox");
TextBox textBox2 = GenerateTextBox("Second textbox");
CustomControl control = new CustomControl(labelCaption: "First control caption");
CustomControl control2 = new CustomControl(labelCaption: "second control caption");
//add the textboxes to the usercontrols
control.Controls.Add(textBox);
control2.Controls.Add(textBox2);
//this displays only 1 control (incorrect)
flowLayoutPanel1.Controls.Add(control);
flowLayoutPanel1.Controls.Add(control2);
flowLayoutPanel1.SetFlowBreak(control, true);
flowLayoutPanel1.SetFlowBreak(control2, true);
//this displays both controls (correct)
//flowLayoutPanel1.Controls.Add(textBox);
//flowLayoutPanel1.Controls.Add(textBox2);
//flowLayoutPanel1.SetFlowBreak(textBox, true);
//flowLayoutPanel1.SetFlowBreak(textBox2, true);
}
private static TextBox GenerateTextBox(string text)
{
TextBox textBox = new TextBox();
textBox.Text = text;
textBox.Dock = DockStyle.Top;
return textBox;
}
}
CustomControl:
public CustomControl(string labelCaption)
{
InitializeComponent();
Label label = new Label();
label.Text = "Rtb..." + labelCaption;
//label.Dock = DockStyle.Top;
//contentPanel.Controls.Add(label);//disabled for now
}
1 ответ
Проблема заключается в вашей инициализации с использованием DockStyle.Top:
CustomControl control = new CustomControl(labelCaption: "First control caption");
control.Dock = DockStyle.Top;
CustomControl control2 = new CustomControl(labelCaption: "second control caption");
control2.Dock = DockStyle.Top;
Они собираются наложить друг на друга таким образом. Вместо использования DockStyle используйте атрибуты позиционирования:
control.Top = 0;
control2.Top = control.Height;
Это должно привести вас туда, куда вам нужно идти.
Отличный способ узнать, как это сделать, - посмотреть на код, сгенерированный разработчиком. Сделайте это вручную в конструкторе, затем посмотрите на сгенерированный код, и это поможет вам обобщить, как сделать позиционирование в коде самостоятельно в будущем.
Изменить на основе вашего комментария:
Вы можете использовать FlowLayoutPanel и устанавливать FlowBreak после каждого:
flowLayoutPanel.Controls.Add(control);
flowLayoutPanel.Controls.Add(control2);
flowLayoutPanel.SetFlowBreak(control, true);
flowLayoutPanel.SetFlowBreak(control2, true);