Автоматическое позиционирование вложенных пользовательских элементов управления

Я хочу, чтобы изменить размеры некоторых сгенерированных элементов управления. Я создаю два 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);
Другие вопросы по тегам