Для нестатического поля, метода или свойства "Control.Controls" требуется ссылка на объект
Нужно добавить на форму 9 кнопок. Всё работает нормально, кроме "Controls.Add(/.../)". Только изучаю ООП. Пытаюсь всё сделать правильно, без костылей. GameField решил сделать статическим классом, потому что игровое поле может быть только одно.
public partial class Form1 : Form
{
static class GameField
{
static public Button[,] buttons = new Button[3, 3];
static GameField()
{
for (int x = 0; x < buttons.GetLength(0); x++)
{
for (int y = 0; y < buttons.GetLength(1); y++)
{
buttons[x, y] = new Button();
buttons[x, y].Size = new Size(200, 200);
buttons[x, y].Location = new Point(12 + 206 * x, 12 + 206 * y);
Controls.Add(buttons[x, y]); // Ошибка
}
}
}
}
public Form1()
{
InitializeComponent();
}
}
Ответы (1 шт):
Автор решения: Александр Савченко
→ Ссылка
Поскольку статический класс не может иметь пользовательского конструктора, то ему нельзя передать аргументы. Поэтому Controls.Add можно добавить в метод, который будет принимать аргументом Form, для создания ссылки: nameOfForm.Controls.Add(/../).
Остаётся только вызвать метод в теле формы с аргументом "this", который передаст ссылку на текущую форму.
static class GameField
{
static public Button[,] buttons = new Button[3, 3];
static GameField()
{
for (int x = 0; x < buttons.GetLength(0); x++)
{
for (int y = 0; y < buttons.GetLength(1); y++)
{
buttons[x, y] = new Button();
buttons[x, y].Size = new Size(200, 200);
buttons[x, y].Location = new Point(12 + 206 * x, 12 + 206 * y);
}
}
}
static public void SetButtons(Form form) // Внимание туть
{
for (int x = 0; x < 3; x++)
{
for (int y = 0; y < 3; y++)
{
form.Controls.Add(GameField.buttons[x, y]);
}
}
}
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
GameField.SetButtons(this); // И туть
}
}