Winforms, создание отступов при использовании свойств Dock - PullRequest
14 голосов
/ 29 апреля 2010

Как добавить отступ или пробел между текстовыми полями при использовании свойства 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 он игнорирует команды размера?

Ответы [ 3 ]

19 голосов
/ 29 апреля 2010

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

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

Пример кода

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. Возможно, это также поможет вам решить вашу проблему.

3 голосов
/ 24 сентября 2013

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

2 голосов
/ 29 апреля 2010

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

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

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

...