TableLayoutPanel sizing - PullRequest
       32

TableLayoutPanel sizing

10 голосов
/ 01 сентября 2011

Возможно, я не использую нужный элемент управления для того, что я хочу. Я заполняю таблицу элементами управления и хочу, чтобы размер каждого столбца автоматически соответствовал содержащимся в нем элементам управления. Например, столбец текстовых полей будет шире столбца флажков. Я не хочу возиться с измерениями, если смогу помочь, из-за сложности разных ОС, разных точек на дюйм, разных шрифтов и т. Д. Таблица может расширяться по горизонтали, чтобы соответствовать элементам управления, с полосой прокрутки. Как это возможно с 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;
        }*/
    }

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

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

Ответы [ 3 ]

15 голосов
/ 02 сентября 2011

Извините, но что плохого в том, что для столбцов установлено значение 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 стиля столбцов.Попробуйте:

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, чтобы выровнять их по текстовым полям, флажкам и т. Д.

0 голосов
/ 02 сентября 2011

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

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

0 голосов
/ 01 сентября 2011

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

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

...