Размер таблицы TableLayoutPanel

146
15

Я не могу использовать правильный элемент управления для того, что хочу. Я заполняю таблицу элементами управления, и я хочу, чтобы каждый столбец автоматически зависел от элементов управления, содержащихся в нем. Например, столбец текстовых полей будет шире столбца флажков. Я не хочу возиться с измерением, могу ли я помочь, из-за сложности разных ОС, разных DPI, разных шрифтов и т.д. Таблица может расширяться горизонтально, чтобы соответствовать элементам управления, с помощью полосы прокрутки. Как это возможно с помощью TableLayoutPanel или какого-либо другого элемента управления?


Спасибо.


Отредактировано для добавления кода:


    private void UpdateLocations()
{
tableLayoutPanel1.RowCount = CurrentSchedule.location.Length + 1;
tableLayoutPanel1.ColumnCount = 7;
int row = 1;
int timeWidth = TextRenderer.MeasureText("00:00:00x", tableLayoutPanel1.Font).Width;

Label lab = new Label();
lab.Text = "Location";
tableLayoutPanel1.Controls.Add(lab, 0, 0);

lab = new Label();
lab.Text = "Arrive";
tableLayoutPanel1.Controls.Add(lab, 1, 0);

lab = new Label();
lab.Text = "Depart";
tableLayoutPanel1.Controls.Add(lab, 2, 0);

lab = new Label();
lab.Text = "Pass?";
tableLayoutPanel1.Controls.Add(lab, 3, 0);

lab = new Label();
lab.Text = "Path";
tableLayoutPanel1.Controls.Add(lab, 4, 0);

lab = new Label();
lab.Text = "Plat";
tableLayoutPanel1.Controls.Add(lab, 5, 0);

lab = new Label();
lab.Text = "Line";
tableLayoutPanel1.Controls.Add(lab, 6, 0);

foreach (location loc in CurrentSchedule.location)
{
TextBox tb = new TextBox();
tb.Text = loc.locationID;
tableLayoutPanel1.Controls.Add(tb, 0, row);

tb = new TextBox();
tb.Text = loc.arrivalTime;
tb.Width = timeWidth;
tableLayoutPanel1.Controls.Add(tb, 1, row);

tb = new TextBox();
tb.Text = loc.departureTime;
tb.Width = timeWidth;
tableLayoutPanel1.Controls.Add(tb, 2, row);

CheckBox cb = new CheckBox();
cb.Checked = loc.passingTime;
tableLayoutPanel1.Controls.Add(cb, 3, row);

tb = new TextBox();
tb.Text = loc.pathCode;
tableLayoutPanel1.Controls.Add(tb, 4, row);

tb = new TextBox();
tb.Text = loc.platformCode;
tableLayoutPanel1.Controls.Add(tb, 5, row);

tb = new TextBox();
tb.Text = loc.lineCode;
tableLayoutPanel1.Controls.Add(tb, 6, row);

row++;
}
/*for (int idx = 0; idx < tableLayoutPanel1.RowCount; idx++)
{
tableLayoutPanel1.RowStyles[idx].SizeType = SizeType.AutoSize;
}
for (int idx = 0; idx < tableLayoutPanel1.ColumnCount; idx++)
{
tableLayoutPanel1.ColumnStyles[idx].SizeType = SizeType.AutoSize;
}*/
}


(Да, он нуждается в тяжелом рефакторинге - я просто пытаюсь заставить его работать первым)


Записанные биты вызывают исключения из границ, хотя логически (для меня) это не должно. Диапазон видится ограниченным тем, что я установил во время разработки, а не во время выполнения.

спросил(а) 2021-01-25T18:09:11+03:00 4 месяца, 3 недели назад
1
Решение
176

Извините, но что случилось, если у столбцов установлен Autosize? Что делает TableLayoutPanel, размер столбцов соответствует установленным в нем элементам управления. Для расширения таблицы и наличия полосы прокрутки потребуется установить для свойства таблиц Autosize значение true, а затем поместите TableLayoutPanel в другую панель с включенными полосами прокрутки. Но размер столбца должен работать из коробки, если я не ошибаюсь в ваших требованиях.


Просто для того, чтобы убедиться, что вы переходите к свойству столбцов и правильно устанавливаете каждый столбец SizeType в AutoSize? Не только свойство AutoSize самой таблицы?


enter image description here


это то, что вы хотите?


-Почтовый код:


Спасибо за код. Я бы предположил, что вы используете дизайнера для этого. По крайней мере, чтобы настроить столбцы, настройте их на автоматизацию и добавьте метки заголовков.


Вы также можете проверить элемент управления Datagrid и связать его с вашим списком местоположений.

Чтобы этот метод работал:


1) причина, по которой ваши столбцы выглядят одинакового размера, заключается в том, что используемые вами заголовки заголовков не являются автоматическими. Все они имеют ширину в шесть пикселей и растягивают столбцы. Сделайте это:


Label lab = new Label();
lab.AutoSize = true;
lab.Text = "Location";
tableLayoutPanel1.Controls.Add(lab, 0, 0);

Вам также необходимо установить для свойства AutoSize значение true в элементе управления CheckBox и любых других ярлыках, которые вы добавляете в качестве содержимого.


2) Установка RowCount и ColumnCount не повлияет на коллекцию RowStyles или ColumnStyles. У вас есть 7 столбцов, но только 2 ColumnStyles. Попробуйте:


tableLayoutPanel1.ColumnStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.ColumnCount; i++)
{
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize));
}

tableLayoutPanel1.RowStyles.Clear();
for (int i = 0; i < tableLayoutPanel1.RowCount; i++)
{
tableLayoutPanel1.RowStyles.Add(new RowStyle(SizeType.AutoSize));
}


Остается только обратить внимание на то, что некоторые элементы управления будут смещены в строках (ярлыки слишком высоки, например). Чтобы исправить это, установите свойство Margin, обычно равное 3,6,3,0, чтобы выровнять их с текстовыми полями и флажками и т.д.

ответил(а) 2021-01-25T18:09:11+03:00 4 месяца, 3 недели назад
44

Вы можете использовать несколько splitContainers внутри другой панели. Но не используйте много вложенных панелей, вы можете получить проблемы с изменением размера/перерисовывания, например .


Вы можете найти много примеров, если хотите использовать SplitContainer.

ответил(а) 2021-01-25T18:09:11+03:00 4 месяца, 3 недели назад
45

Вам нужно обработать событие ControlAdded, а затем изменить размер столбца, если новая ширина элемента управления больше ширины столбца...

Вы говорите, что не хотите возиться с измерением, но если вы изменяете размер, вы как-то должны. Шрифты и т.д. Не должны входить в него, если вы будете осторожны с TextAlign ваших флажков и т.д.

ответил(а) 2021-01-25T18:09:11+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема