C # Область применения по всем методам - PullRequest
0 голосов
/ 17 августа 2011

только что возникли проблемы с областью действия объектов. Я определяю некоторые панели в декларации формы:

        public Form1()
    {
        InitializeComponent();

        Panel[] panels = new Panel[10];

        for (int i=0;i<10;i++)
        {
            //Panel newPanel = new Panel();
            panels[i] = new Panel();
            panels[i].Size = new Size(40, 37);
            panels[i].BackgroundImage = imageList1.Images[0];
            panels[i].Location = new Point(i * 20, i * 20);
            this.Controls.Add(panels[i]);
        }

    }

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

Название «панели» не существует в текущем контексте

Вот строка, которая получает сообщение об ошибке

        private void PanelMoveTimer_Tick(object sender, EventArgs e)
    {
        if (panels[0].Location.X >= 0)

Должен ли я вызывать их? или объявить их публичными? как мне сделать их доступными?

Ответы [ 4 ]

4 голосов
/ 17 августа 2011

Объявите панели в классе формы, а не в ее конструкторе.

 private Panel[] _panels = new Panel[10];

 public Form1()
    {
        InitializeComponent();               

        for (int i=0;i<10;i++)
        {
            //Panel newPanel = new Panel();
            _panels[i] = new Panel();
            _panels[i].Size = new Size(40, 37);
            _panels[i].BackgroundImage = imageList1.Images[0];
            _panels[i].Location = new Point(i * 20, i * 20);
            this.Controls.Add(_panels[i]);
        }

    }
1 голос
/ 17 августа 2011

Локальные переменные являются локальными для метода и не доступны для разных.Если вы хотите использовать значение в методах объекта, проще всего сделать его полем.

class Form1 { 
  Panel[] panels;

  public Form1() {
    this.panels = new Panel[10];
    ...
  }
}
0 голосов
/ 17 августа 2011

Упрощенный подход состоит в том, чтобы рассматривать области в качестве ближайших фигурных скобок, содержащих объявление вашей переменной.Переменная становится доступной в любом месте между этими фигурными скобками.

Итак, когда вы объявляете «панели» в конструкторе, она доступна только в конструкторе;если вы объявите его в классе, он будет доступен в любом из методов класса.

public class Form1 : Form
{ //Beginning of the 'panels' scope
  Panels[] panels;

  public Form1()
  {
    InitializeComponent();
    panels = new Panel[10]; // initialization in constructor
  }

  private void PanelMoveTimer_Tick(object sender, EventArgs e)
  {
      if (panels[0].Location.X >= 0) // usage in method
        ..
  }
}
0 голосов
/ 17 августа 2011

Проблема заключается в следующей строке:

Panel[] panels = new Panel[10];

Поскольку вы определяете там массив Panel, он доступен только в области конструктора, т. Е. Метода Form1 ().

Что вам нужно сделать, как минимум:

Panel[] panels = new new Panel[10];

public Form1()
{
   InitializeComponent();
   ...

Таким образом, панели будут доступны для всех нестатических методов этого класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...