Как динамически масштабировать размер элемента управления в TableLayoutPanel

Моя цель состоит в том, чтобы иметь сетку кнопок, которые представляют мой массив 2d с помощью TableLayoutPanel.

В настоящее время я могу получить правильное количество столбцов и строк, и он добавляет кнопки в нужное место.

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

Заполнение таблицы

int[,] testArr = new int[,] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };

        tableLayoutPanel_TopView.ColumnCount = testArr.GetLength(0);
        tableLayoutPanel_TopView.RowCount = testArr.GetLength(1);
        tableLayoutPanel_TopView.AutoSize = true;

        for (int y = 0; y < testArr.GetLength(1); y++)
        {
            for (int x = 0; x < testArr.GetLength(0); x++)
            {
                Button btn = new Button
                {
                    Text = x.ToString() + "." + y.ToString(),
                    Dock = DockStyle.Fill,
                };
                tableLayoutPanel_TopView.Controls.Add(btn);
            }
        }

        Single percHeight = ((Single)1 / (Single)tableLayoutPanel_TopView.RowStyles.Count) * 100;
        Single percWidth = ((Single)1 / (Single)tableLayoutPanel_TopView.ColumnStyles.Count) * 100;

        foreach (ColumnStyle style in tableLayoutPanel_TopView.ColumnStyles)
        {
            style.SizeType = SizeType.Percent;
            style.Width = percWidth;
        }

        foreach (RowStyle style in tableLayoutPanel_TopView.RowStyles)
        {
            style.SizeType = SizeType.Percent;
            style.Height = percHeight;
        }

Настройки TableLayoutPanel

        this.tableLayoutPanel_TopView.ColumnCount = 1;
        this.tableLayoutPanel_TopView.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle());
        this.tableLayoutPanel_TopView.Dock = System.Windows.Forms.DockStyle.Fill;
        this.tableLayoutPanel_TopView.Location = new System.Drawing.Point(3, 16);
        this.tableLayoutPanel_TopView.Name = "tableLayoutPanel_TopView";
        this.tableLayoutPanel_TopView.RowCount = 1;
        this.tableLayoutPanel_TopView.RowStyles.Add(new System.Windows.Forms.RowStyle());
        this.tableLayoutPanel_TopView.Size = new System.Drawing.Size(638, 463);
        this.tableLayoutPanel_TopView.TabIndex = 0;

Однако это дает следующий результат:

Текущая таблица

Как видите, ширина и высота каждой кнопки имеет смысл только начиная со второго столбца и второй строки. Что сделать, чтобы все кнопки были одинакового размера?


person Jader    schedule 20.03.2019    source источник
comment
Похоже, что только первый стиль строки имеет значение Percent, а другой — фиксированный размер или меньшее значение. Перед назначением новых значений следует удалить все стили. Сделайте то же самое, используя только конструктор, и назначьте 25% всем строкам и столбцам. У вас будет другое поведение. Не забудьте свойства MaximumSize и MinimumSize. Это очень важно в таком макете. Для TableLayoutPanel и размещенных на нем элементов управления.   -  person Jimi    schedule 20.03.2019
comment
Спасибо, я очистил ColumnStyles и RowStyles, а затем добавил соответствующий стиль для каждой строки и столбца. Причина, по которой я не делаю этого через редактор, заключается в том, что я знаю размеры массива только во время выполнения.   -  person Jader    schedule 21.03.2019
comment
Конечно. Я предложил протестировать его с помощью Designer, чтобы проблема всплыла. Если вы исправили это, напишите как ответ.   -  person Jimi    schedule 21.03.2019


Ответы (1)


Решение

Я исправил это, очистив ColumnStyles и RowStyles и добавив новый стиль для каждой строки и столбца. Для каждого стиля SizeType установлено значение Percent, и рассчитывается ширина/высота.

Код

Я заменил testArr на sortedContainers, коллекцию, для которой была создана функция.

       // above code hasn't changed
        Single percHeight = ((Single)1 / (Single)tableLayoutPanel_TopView.RowStyles.Count) * 100;
        Single percWidth = ((Single)1 / (Single)tableLayoutPanel_TopView.ColumnStyles.Count) * 100;

        tableLayoutPanel_TopView.ColumnStyles.Clear();
        tableLayoutPanel_TopView.RowStyles.Clear();

        for (int x = 0; x < sortedContainers.Width; x++)
        {
            tableLayoutPanel_TopView.ColumnStyles.Add(new ColumnStyle
            {
                SizeType = SizeType.Percent,
                Width = percWidth
            });
        }

        for (int y = 0; y < sortedContainers.Length; y++)
        {
            tableLayoutPanel_TopView.RowStyles.Add(new RowStyle
            {
                SizeType = SizeType.Percent,
                Height = percHeight
            });
        }
person Jader    schedule 21.03.2019