Как получить доступ к кнопкам в другом классе из Form1.cs

#c#

#c#

Вопрос:

У меня есть 9 кнопок, Form1.Designer.cs и я хочу получить к ним доступ в другом классе, Puzzle.cs потому что позже мне нужно изменить изменения кнопок в классе модели. Приведенный ниже код — это то, что я пытался.

 private Button[,] buttons = new Button[3, 3]
{ { Form1.button1, Form1.button2, Form1.button3 }, 
  { Form1.button4, Form1.button5, Form1.button6 }, 
  { Form1.button7, Form1.button8, Form1.button9 } };
  

Это не удается, поскольку модификатор для кнопок не является статическим. Я изменил их на статический тип, но это вызывает ошибки для кнопок.
Кто-нибудь может дать несколько советов?

Ответ №1:

Вам нужна ссылка на экземпляр Form1 класса. Если бы он был вызван form , вы могли бы получить доступ к кнопке, подобной form.button1 .

Но я не уверен, что доступ к кнопкам формы из другого класса является хорошим дизайном.

Ответ №2:

Для правильной компиляции вам необходимо внести следующие изменения:

 public partial class Puzzle : Form
{
    private Button[,] buttons;

    public Puzzle(Form1 form1)
    {
        buttons = new Button[,]
        {
            { form1.Button1, form1.Button2, form1.Button3, },
            { form1.Button4, form1.Button5, form1.Button6, },
            { form1.Button7, form1.Button8, form1.Button9, },
        }
    };
}
  

Идея здесь в том, что Form1 — это класс, а не экземпляр класса… Класс подобен чертежу дома, а дом подобен экземпляру этого чертежа.

Чтобы вынести мебель из дома, вы сначала должны создать и инициализировать этот дом (построить, если хотите), а затем получить доступ к экземплярам мебели дома.

В этом случае вам нужно будет создать экземпляр нового Form1 и передать его конструктору формы головоломки.

 Form1 myForm = new Form1();
Puzzle myPuzzle = new Puzzle(myForm);
  

Теперь Puzzle сможет получить доступ к этому экземпляру кнопок Form1.

Примечание:

Вы можете найти экземпляр программы Form1, заглянув в Program.cs файл вашего решения.

Комментарии:

1. Спасибо! Но куда мне поместить «Form1 myForm = new Form1 ();»»Головоломка myPuzzle = новая головоломка (myForm);» эти две строки???

2. Как я уже говорил, Program.cs уже имеет Form1 myForm = new Form1(); , но имя ссылочной переменной Form1 может быть чем-то иным, чем «myForm». Кроме того, вы уверены, что вам нужны две формы? Возможно, «Головоломка» может быть просто классом, а не формой.

3. Головоломка — это класс. И почему эти кнопки все еще имеют нулевые значения, когда я пытаюсь вызвать их в Form1.cs. ‘public void reset() { for (int i = 0; i < 3; i ) for (int j = 0; j < 3; j ) { кнопки [i, j].BackColor = Color.Lime; } }’ это метод в классе Puzzle . Пожалуйста, помогите. Спасибо!

4. Вы должны присвоить значения каждой кнопке [x, y] index. button[0,0] = form1.Button1 , и т.д., но form1 должны быть экземпляром формы, как указано выше. Чтобы получить нужную функциональность, вам нужно передать переменную экземпляра form1 конструктору Puzzle var puzzle = new Puzzle(form1) . Только после этого вы можете начать использовать кнопки в вашем экземпляре Puzzle .