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 (не бесплатно).