@NikHaker
/

Как сделать все ячейки равных размеров в tableLayoutPanel WinForms?

Как можно сделать все ячейки одного размера в tableLayoutPanel, чтобы даже при добавлении/удалении столбца или строки они все меняли размер и оставались одинаковыми? То есть они должны быть равными между собой по ширине и высоте. AutoSize=true пробовал, но при добавлении или удалении столбца всё становится не равным. Как это можно осуществить?
  • Вопрос задан
  • 2633 просмотра
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Указать размер в процентах, если размер должен изменяться в зависимости от размера формы.
Либо указать точный размер в пикселях.

Если требуются разные размеры для разных колонок/строк, то этого можно достичь с использованием вложенных TableLayoutPanel.

Для выравнивания можно использовать колонки/строки с размером 100%. Примерно как в HTML.

Вот пример формы для программного генерирования TableLayoutPanel с добавлением колонок и строк одинакового размера (этот код можно просто вставить в Form1):
public partial class Form1 : Form
{

  private Panel TableContainer = new Panel();
  private NumericUpDown Columns = new NumericUpDown();
  private NumericUpDown Rows = new NumericUpDown();

  public Form1()
  {
    InitializeComponent();

    this.Width = 420;
      
    var flowLayoutPanel = new FlowLayoutPanel();
    var LabelColumns = new Label();
    var LabelRows = new Label();
    var Create = new Button();

    // панель для редактора таблицы
    flowLayoutPanel.SuspendLayout();
    flowLayoutPanel.AutoSize = true;
    flowLayoutPanel.Controls.Add(LabelColumns);
    flowLayoutPanel.Controls.Add(Columns);
    flowLayoutPanel.Controls.Add(LabelRows);
    flowLayoutPanel.Controls.Add(Rows);
    flowLayoutPanel.Controls.Add(Create);
    flowLayoutPanel.Dock = DockStyle.Top;
    flowLayoutPanel.Location = new Point(0, 0);

    LabelColumns.AutoSize = true;
    LabelColumns.Dock = DockStyle.Fill;
    LabelColumns.ImageAlign = ContentAlignment.MiddleLeft;
    LabelColumns.Location = new Point(3, 0);
    LabelColumns.Size = new System.Drawing.Size(53, 29);
    LabelColumns.Text = "Колонок:";
    LabelColumns.TextAlign = ContentAlignment.MiddleLeft;

    LabelRows.AutoSize = true;
    LabelRows.Dock = DockStyle.Fill;
    LabelRows.Location = new Point(117, 0);
    LabelRows.Size = new Size(40, 29);
    LabelRows.Text = "Строк:";
    LabelRows.TextAlign = ContentAlignment.MiddleLeft;

    Columns.Dock = DockStyle.Fill;
    Columns.Location = new Point(62, 3);
    Columns.Minimum = 1;
    Columns.Size = new System.Drawing.Size(49, 20);
    Columns.Value = 3;

    Rows.Dock = DockStyle.Fill;
    Rows.Location = new Point(163, 3);
    Rows.Minimum = 1;
    Rows.Size = new Size(49, 20);
    Rows.Value = 2;

    Create.AutoSize = true;
    Create.Dock = DockStyle.Left;
    Create.Location = new Point(218, 3);
    Create.Size = new Size(75, 23);
    Create.Text = "Создать";
    Create.UseVisualStyleBackColor = true;
    Create.Click += new System.EventHandler(CreateTable);

    // контейнер для вывода готовой таблицы
    TableContainer.Dock = DockStyle.Fill;
      
    // добавляем необходимые элементы на форму
    this.Controls.Add(flowLayoutPanel);
    this.Controls.Add(TableContainer);

    this.Controls.SetChildIndex(flowLayoutPanel, 1);
    this.Controls.SetChildIndex(TableContainer, 0);
  }

  private void CreateTable(object sender, EventArgs e)
  {
    // удаляем предыдущую таблицу
    TableContainer.Controls.Clear();

    // создаем новую
    var tableLayoutPanel = new TableLayoutPanel();
    tableLayoutPanel.Dock = System.Windows.Forms.DockStyle.Fill;
    tableLayoutPanel.Location = new System.Drawing.Point(0, 0);
    tableLayoutPanel.Visible = true;

    tableLayoutPanel.ColumnCount = Convert.ToInt32(Columns.Value);
    tableLayoutPanel.RowCount = Convert.ToInt32(Rows.Value);

    // генератор случайных чисел для раскраски панелей (чтобы было видно)
    var rnd = new Random(DateTime.Now.Millisecond);

    // определяем размер одной колонки и строки, в процентах
    int width = 100 / tableLayoutPanel.ColumnCount;
    int height = 100 / tableLayoutPanel.RowCount;

    this.Text = String.Format("{0}x{1}", width, height);

    // добавляем колонки и строки
    for (int col = 0; col < tableLayoutPanel.ColumnCount; col++)
    {
      // добавляем колонку
      tableLayoutPanel.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, width));

      for (int row = 0; row < tableLayoutPanel.RowCount; row++)
      {
        // добавляем строку
        if (col == 0) 
        {
          tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Percent, height));
        }

        // добавляем цветную панель, чтобы было видно ячейку в таблице
        var panel = new Panel();
        panel.BackColor = Color.FromArgb(rnd.Next(0, 255), rnd.Next(0, 255), rnd.Next(0, 255));
        panel.Dock = DockStyle.Fill;
        tableLayoutPanel.Controls.Add(panel, col, row);
      }
    }

    // добавляем таблицу в контейнер
    TableContainer.Controls.Add(tableLayoutPanel);
  }


}

2ff063c8d06f474da07fa7df6c515be8.gif
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы