Изменение размерности двумерной матрицы из TextBox'ов C# WinForms

есть матрица динамически созданная из TextBox'ов.

введите сюда описание изображения

Надо реализовать кнопки уменьшения и увеличения размерности матрицы (матрица квадратная всегда).

Создается она следующим образом:

void Create_matrix (int matrSize)
        {
            int counter = 0;
            TextBox[] MatrixNodes = new TextBox[matrSize * matrSize];
            for (int i = 0; i < matrSize; i++)
            {
                for (int j = 0; j < matrSize; j++)
                {
                    var tb = new TextBox();
                    tb.Location = new Point(5 + (j * 22), 30 + (i * 22));
                    tb.Name = string.Format("Node_{0}{1}", i, j);
                    tb.Visible = true;
                    tb.Width = 20;
                    this.Controls.Add(tb);
                    counter++;
                }
            }
        }

И собственно сами кнопки реализованы так:

        private void Button_plus_matrix_Click(object sender, EventArgs e)
        {
            size_matrix++;
            Create_matrix(size_matrix);
        }

        private void Button_minus_matrix_Click(object sender, EventArgs e)
        {
            size_matrix--;
            Create_matrix(size_matrix);
        }

Проблема в том что есть дефолтное значение размера матрицы (5) и она прорисовывается сразу как только запускается форма, и из-за этого при нажатии кнопок и соответственно вызове функции Create_matrix новая матрица рисуется поверх старой.

  1. Как сделать так чтобы при нажатии на кнопки изменения размерности все старые TextBox'ы удалялись и перерисовывались новые?
  2. Почему когда смотрю в отладчике объект MatrixNodes в котором, как я думал будет несколько TextBox'ов, на самом деле лежат какие-то пустышки? введите сюда описание изображения

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


Ответы (1 шт):

Автор решения: aepot

Вам нужно в дизайнере формы создать Panel, к примеру panel1. И добавлять текстбоксы туда panel1.Controls.Add(tb).

А в начале метода, очищать содержимое панели.

void Create_matrix (int matrSize)
{
    panel1.Controls.Clear();
    // ...
}

Еще можете сделать изменение размера через свойство

private int sizeMatrix = 5;

public int SizeMatrix
{
    get => sizeMatrix;
    set
    {
        if (value > 0)
        {
            sizeMatrix = value;
            Create_matrix(value);
            // здесь же можно обновить отображение размера
        }
        Button_minus_matrix.Enabled = value > 1;
        Button_plus_matrix.Enabled = value < 10;
    }
}
   
private void Button_plus_matrix_Click(object sender, EventArgs e)
{
    SizeMatrix++;
}

private void Button_minus_matrix_Click(object sender, EventArgs e)
{
    SizeMatrix--;
}

Еще подсказка на подумать: string.Format("Node_{0}{1}", i, j), как вы поймете, в какой строке и колонке находится Node_111, в 11, 1 или в 1,11?

→ Ссылка