Существует у меня квадрат из кнопок, размером 5х5 в WinForms.
Есть у меня и двумерный массив, куда и нужно поместить все 25 кнопок(с учётом местонахождения, конечно), для дальнейшего перебора и изменения параметров.
Вопрос: Как наиболее эффективно поместить кнопки за названиями btn1, btn2... в двумерный массив. Я, конечно, могу их ручками поместить в массив, но 25 строк писать для этого не кажется хорошим решением. Что можно сделать или изменить(что-то в массиве, например), для хорошего решения?
- 67
1 Answers
Когда интерфейс хранит данные - это как хвост виляет собакой.
Если вам нужно хранить данные о кнопках, значит сами кнопки изначально должны появиться на форме на основе этих данных. То есть не нужно брать кнопки и засовывать в массив. Нужно брать массив и изначально на его основе создавать кнопки. Тогда вопрос отпадет сам собой.
К примеру, создадим класс данных.
public class ButtonInfo
{
public Point Location { get; set; }
public string Text { get; set; }
}
Заполним к примеру его тестовыми данными и нарисуем на форме кнопки, пусть нам нужно нарисовать клавиатуру для калькулятора.
Я создал новый проект и написал такой код
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
// создаем массив
ButtonInfo[] buttons = new ButtonInfo[12];
// заполняем массив
for (int i = 0; i < buttons.Length; i++)
{
buttons[i] = new ButtonInfo
{
Location = new Point(i % 3 * 100 + 10, i / 3 * 100 + 10),
Text = i switch
{
< 9 => (i + 1).ToString(),
9 => "±",
10 => "0",
11 => ",",
_ => "Кнопка"
}
};
}
// выводим кнопки на форму
for (int i = 0; i < buttons.Length; i++)
{
Button btn = new Button
{
Text = buttons[i].Text,
Location = buttons[i].Location,
Size = new Size(90, 90),
Font = new Font("Segoe UI", 24, FontStyle.Regular, GraphicsUnit.Point)
};
btn.Click += Btn_Click;
this.Controls.Add(btn);
}
}
// при нажатии на любую кнопку сработает этот обработчик события
private void Btn_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
MessageBox.Show($"Нажата кнопка '{btn.Text}'");
}
}
На форме выглядит это так
При нажатии на кнопку выскакивает сообщение
Решение вашего вопроса заключается в хранении и передаче массива ButtonInfo[]. А на основе этого массива вы сможете сгенерить этот же интерфейс в любой форме. И не потребуются никакие имена для кнопок. Если название Text кнопки не подходит для идентификации самой кнопки или у вас несколько кнопок с одинм и тем же текстом, используйте например Button.Tag, записывая туда то что нужно, и считывайте значение в обработчике события.
А контролы должны жить на форме, их не нужно никуда переносить и нигде хранить. К тому же когда форма закроется, она задиспозит все созданные вами кнопки и вы больше не сможете их нигде использовать.
- 49,560


P.S: Увидел правку, сейчас посмотрю.
– Ilya Jun 17 '21 at 15:01this.Controls("btn" + i.ToString()), попробую помутить с названиями кнопок и написать так. Если не получится - попробую воспользоваться вашим вариантом. – Ilya Jun 17 '21 at 15:17Controls.Find(), пока времени нету что написать свой вариант здесь. Ваш, в вероятно, более правильный подход, ибо я сделал через имена (это было учебное задание, поэтому такая логика подошла). Хотя его попробовать смогу только позже. В любом случае, спасибо за ответ. – Ilya Jun 21 '21 at 06:22