Я использую TableLayoutPanel, чтобы разделить клиентскую область на 3 строки (есть только 1 столбец). Верхний и нижний ряды имеют фиксированную высоту; они будут содержать верхний и нижний колонтитулы, каждый из которых изначально содержит дочерний элемент управления меткой, содержащий статический текст (для начала). Средний ряд должен быть динамически изменен, чтобы заполнить оставшуюся область. Эта средняя панель в конечном итоге будет содержать список. У меня есть класс менеджера, который принимает в качестве аргумента объект панели (ExplorerTableLayoutPanel), управляемый:
public class ExplorerTableLayoutPanelManager
{
public ExplorerTableLayoutPanelManager(ExplorerTableLayoutPanel panel)
{
LayoutPanel = panel;
}
Существует 3 метода, которые создают каждую из 3 строк в макете таблицы:
private void AddHeaderRow()
{
const int headerHeight = 30;
LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, headerHeight));
Label label = new Label();
label.BackColor = Color.AliceBlue;
label.BorderStyle = BorderStyle.None;
label.ForeColor = Color.LightGray;
label.TextAlign = ContentAlignment.MiddleRight;
label.Text = "Header Banner";
label.Dock = DockStyle.Fill;
float size = label.Font.SizeInPoints;
label.Font = new Font(label.Font.Name, size * 2);
const int column = 0, row = 0;
LayoutPanel.Controls.Add(label, column, row);
}
private void AddBodyRow()
{
LayoutPanel.RowStyles.Add(new RowStyle(SizeType.AutoSize));
Label label = new Label();
label.BorderStyle = BorderStyle.FixedSingle;
label.ForeColor = Color.LightGray;
label.TextAlign = ContentAlignment.MiddleCenter;
label.Text = "Content Under construction ...";
label.Dock = DockStyle.Fill;
float size = label.Font.SizeInPoints;
label.Font = new Font(label.Font.Name, size * 2);
const int column = 0, row = 1;
LayoutPanel.Controls.Add(label, column, row);
}
private void AddFooterRoow()
{
const int footerHeight = 30;
LayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, footerHeight));
Label label = new Label();
label.BackColor = Color.AliceBlue;
label.BorderStyle = BorderStyle.None;
label.ForeColor = Color.LightGray;
label.TextAlign = ContentAlignment.MiddleRight;
label.Text = "Footer Banner";
label.Dock = DockStyle.Fill;
float size = label.Font.SizeInPoints;
label.Font = new Font(label.Font.Name, size * 2);
const int column = 0, row = 2;
LayoutPanel.Controls.Add(label, column, row);
}
Проблема, которую я вижу, состоит в том, что последняя строка занимает фиксированную высоту строки, которую я запросил как 30. Эта часть верна. Однако первый и второй ряды делят оставшееся пространство поровну между ними, а это не то, что я хочу. Как видите, я явно установил высоту строки 30 для первой строки точно так же, как и для последней строки, но, похоже, это не сработает. Во 2-й строке (в середине) для размера RowStyle установлено значение SizeType.AutoSize, которое, как я предполагал, означало использование оставшегося пространства, поэтому не устанавливайте размер явно. Я могу ошибаться, но я не уверен.