0

есть матрица динамически созданная из 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'ов, на самом деле лежат какие-то пустышки? введите сюда описание изображения

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

  • Вы создаёте текстбокс: var tb = new TextBox();, но не помещаете его в массив. Добавьте: MatrixNodes[i, j] = tb; – Alexander Petrov Oct 03 '20 at 10:52
  • Если вдруг захотите познакомиться с WPF, то есть вот такое. Кстати, почему не используете DataGridView? – aepot Oct 03 '20 at 11:37
  • @aepot Чисто из интереса, так как решение данной задачи с использованием DataGridView уже есть. – Тимур Бердиев Oct 03 '20 at 12:35

1 Answers1

1

Вам нужно в дизайнере формы создать 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?

aepot
  • 49,560
  • Спасибо все работает, долго мучался я из-за незнания, у меня было прописано this.Controls.Add(tb); вместо Matrix_panel.Controls.Add(tb); и это работало некорректно, после исправления все стало нормально, мда this опасная штука. – Тимур Бердиев Oct 05 '20 at 16:10
  • И еще из-за не совсем понятного метода XXX.Controls.Add(), почитал что это за метод, но все равно не очень понятно, почему без него ничего не происходит вообще? Он типо разрешает создание, редактирование для элементов панели управления типо? – Тимур Бердиев Oct 05 '20 at 16:13
  • @ТимурБердиев вы работаете с коллекцией, коллекция очищается с помощью .Clear(), любая. – aepot Oct 05 '20 at 16:15
  • Аааа типо эта строчка Matrix_panel.Controls.Add(tb); означает что я добавляю ТекстБоксы в одну коллекцию под управление Matrix_panel. А что тогда означает эта строчка Controls.Add(Matrix_panel);? Типо добавление панели в коллекцию под управление формой? – Тимур Бердиев Oct 05 '20 at 16:20
  • Matrix_panel.Controls.Clear(); counter = 0;TextBox[] MatrixNodes; Controls.Add(Matrix_panel);``` Вот чтобы понятнее стало – Тимур Бердиев Oct 05 '20 at 16:20
  • @ТимурБердиев this.Controls и просто Controls - одно и то же в данном конкретном случае. – aepot Oct 05 '20 at 16:23