Изменение размерности двумерной матрицы из 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 новая матрица рисуется поверх старой.
- Как сделать так чтобы при нажатии на кнопки изменения размерности все старые TextBox'ы удалялись и перерисовывались новые?
- Почему когда смотрю в отладчике объект MatrixNodes в котором, как я думал будет несколько TextBox'ов, на самом деле лежат какие-то пустышки?

Просьба, не предлагать решить данную проблему другими способами, мне интересно реализовать эту фичу именно таким способом, если способ ***но, и работать не будет, то так и скажите.
Ответы (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?
