#c# #height #cell #tablelayoutpanel
#c# #высота #ячейка #tablelayoutpanel
Вопрос:
Как я могу установить высоту по умолчанию для всех TableLayoutPanel
строк в c # равной 16px?
Обычно я бы сделал:
for (int i = 0; i < amount_of_rows; i )
{
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16));
}
Но в моем случае у меня 8 столбцов и неизвестное количество строк. Количество строк становится известным после добавления всех элементов управления, не раньше.
Это мой код:
TableLayoutPanel panel = new TableLayoutPanel
{
BackColor = SystemColors.Control,
CellBorderStyle = TableLayoutPanelCellBorderStyle.Single,
AutoScroll = true,
Width = 500,
Location = new Point(-1, -1),
ColumnCount = 8
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
int amountOfRows = 0;
for (...)
{
// a lot of code which populates panel with generated controls and counts amountOfRows
}
panel.RowCount = amountOfRows;
Controls.Add(panel);
Такой код создает строки высотой 24 пикселя.
Добавление ColumnStyles в таблицу после ее заполнения следующим образом:
for (int i = 0; i < amountOfRows ; i )
{
panel.RowStyles.Add(new RowStyle(SizeType.Absolute, 16));
}
работает, но это делает последнюю строку очень большой.
РЕДАКТИРОВАТЬ: пример кода, включающий добавление элемента управления:
TableLayoutPanel panel = new TableLayoutPanel
{
BackColor = SystemColors.Control,
CellBorderStyle = TableLayoutPanelCellBorderStyle.Single,
AutoScroll = true,
Width = 500,
Location = new Point(-1, -1),
ColumnCount = 8,
Margin = new Padding(0),
Padding = new Padding(0)
};
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 16));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 73));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 38));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
panel.ColumnStyles.Add(new ColumnStyle(SizeType.Absolute, 52));
for (int i = 0; i < 10; i ) // lets assume we don't know it will be added 10x
{
CheckBox exchangeEnabled = new CheckBox
{
Margin = new Padding(0),
Padding = new Padding(0),
Dock = DockStyle.Fill,
CheckAlign = ContentAlignment.MiddleCenter
};
panel.Controls.Add(exchangeEnabled, 0, i);
}
Controls.Add(panel);
Ответ №1:
Я предполагаю, что причина, по которой вы получаете ячейки высотой 24 пикселя, заключается в том, что вы добавляете элементы управления высотой 16 пикселей.
Если вы не измените значения, значения по умолчанию Margin
и Padding
равны 3 пикселям для всех сторон.
В результате получится 2×3 2×3 дополнительных пикселя, что в сумме составит 24 пикселя для ячеек.
Чтобы контролировать высоту, вы должны контролировать высоту не только добавляемых вами элементов управления, но также Padding
и дочерних Margin
значений TLP.
Это также способ увеличить строки или столбцы и единственный известный мне способ выравнивания / размещения элементов управления в пикселях идеально..
Поведение закрепления дочерних элементов управления такое же, как и у других элементов управления контейнера.
Поведение привязки дочерних элементов управления в TableLayoutPanel отличается от поведения в других элементах управления контейнера. Если значение свойства привязки дочернего элемента управления установлено равным левому или правому, элемент управления будет размещен напротив левой или правой границы ячейки на расстоянии, равном сумме свойства Margin элемента управления и свойства Padding панели. Если заданы оба значения — левое и правое, размер элемента управления будет соответствовать ширине ячейки с учетом значений полей и отступов. Поведение для привязки сверху и снизу аналогично. Дополнительные сведения см. в разделе Как: Привязать и закрепить дочерние элементы управления в элементе управления TableLayoutPanel.
Если вам нужен дочерний элемент управления для имитации поведения привязки по умолчанию в других элементах управления контейнера, вы можете настроить свойства Margin и Padding, чтобы поддерживать постоянное расстояние между границей элемента управления и границей ячейки.
Комментарии:
1. Спасибо, но это ничего не меняет. Я добавил Margin = новое заполнение (0), Padding = новое заполнение (0) в TableLayoutPanel и ее элементы управления. Я добавил пример кода, включающий добавление элемента управления. Или я не совсем вас понял?
2. Хм, нет, вы меня правильно поняли. Видите ли вы влияние при установке большого отступа / поля? — Каковы максимальные. высоты? По умолчанию для флажка включен автоматический размер, поэтому высота будет зависеть от размера шрифта.
3. Установка высоты = 16 для всех элементов управления выполнена. Даже когда поля и отступы равны 0, по какой-то причине все равно добавляется некоторое пространство вокруг. После указания точной высоты это работает. Спасибо, что указали мне правильное направление.
4. В конце я сделал это, запустив другой цикл в начале, который подсчитывает количество строк и добавляет строки размером 16 пикселей перед добавлением элементов управления. Мне пришлось сделать это так, потому что невозможно изменить размер текстового поля, который составляет одну строку. Возможно только установить размер многострочного текстового поля, который мне не нужен. Winforms, по-видимому, не продвинута как css ;).