Winforms, создающая прописку при использовании свойств Dock

Как добавить прописку или пробел между текстовыми полями при использовании свойства dockstyle.top?

for(int i =0; i< 10; i++) {
    textboxes[i] = new TextBox();
    textboxes[i].Dock = DockStyle.Top;
    mypanel.Controls.Add(textboxes[i]); 
}

Приведенный выше код помещает текстовые поля прямо друг под друга. Невозможно понять это без использования массовых панелей или фиксированного позиционирования. Как сделать следующее?

1) Я хотел бы добавить около 10-20 пикселей между ящиками.

2) Как изменить размер (высота, ширина) текстовых полей, так как при использовании dockstyle.top он игнорирует команды размера?

Ответы

Ответ 1

С DockStype.Top вы не можете изменить ширину ваших текстовых полей, потому что они состыкованы. Вы можете изменить высоту. Но чтобы изменить высоту TextBox, вы должны заранее установить Multiline = true.

Чтобы получить пространство между различными блоками, вы должны поместить каждый TextBox внутри панели, установите TextBox.Dock = Fill, Panel.Dock = Top и Panel.Padding = 10. Теперь у вас есть некоторое пространство между каждым текстовым полем.

Пример кода

for (int i = 0; i < 10; i++)
{
    var panelTextBox = CreateBorderedTextBox();

    this.Controls.Add(panelTextBox);
}

private Panel CreateBorderedTextBox()
{
    var panel = CreatePanel();
    var textBox = CreateTextBox();

    panel.Controls.Add(textBox);
    return panel;
}

private Panel CreatePanel()
{
    var panel = new Panel();
    panel.Dock = DockStyle.Top;
    panel.Padding = new Padding(5);

    return panel;
}

private TextBox CreateTextBox()
{
    var textBox = new TextBox();
    textBox.Multiline = true;
    textBox.Dock = DockStyle.Fill;

    return textBox;
}

Что я забыл, вы также можете попробовать FlowLayoutPanel. Просто удалите DockStyle.Top с панелей и поместите их в FlowLayoutPanel. Также вы должны установить FlowDirection в TopDown. Возможно, это также поможет вам решить вашу проблему.

Ответ 2

Другая работа, которая подходит для небольших макетов, заключается в том, чтобы просто добавить элемент управления Label, после чего также состыкован с Top, который не является автозамещением, Text=" ", Height=your padding. Это очень полезно для нечетного бита заполнения при использовании конструктора.

Ответ 3

Я знаю, откуда вы пришли, это особенно неприятно после возвращения в WinForms из WPF.

Я бы предложил использовать TableLayoutPanel, в котором каждый TextBox получал бы свою собственную ячейку и настраивал свойства клеток. Это должно решить проблемы с заполнением и размером.

Другой альтернативой может быть использование более сложных элементов управления компоновкой, таких как DevExpress (не бесплатно).