Для нестатического поля, метода или свойства "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); // И туть
    }
}
→ Ссылка