刚刚遇到了一些关于对象范围的问题。我在表单声明中定义了一些面板:
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]);
}
}
但是,当我尝试在刻度方法中使用这些面板(更改图像或移动它们)时,我得到了
当前上下文中不存在名称“panel”
以下是获取错误消息的行
private void PanelMoveTimer_Tick(object sender, EventArgs e)
{
if (panels[0].Location.X >= 0)
我必须调用它们吗?或者宣布他们是公开的?我如何让他们可以访问?
答案 0 :(得分:4)
声明表单类中的面板,而不是它的构造函数。
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 :(得分:1)
Locals变量是方法的本地变量,不可用于不同的变量。如果要在对象的方法中使用值,最简单的方法是使其成为字段。
class Form1 {
Panel[] panels;
public Form1() {
this.panels = new Panel[10];
...
}
}
答案 2 :(得分:0)
问题在于这一行:
Panel[] panels = new Panel[10];
因为你在那里定义了Panel数组,它只在构造函数的范围内可用,IE那个Form1()方法。
你需要做的是,至少是:
Panel[] panels = new new Panel[10];
public Form1()
{
InitializeComponent();
...
这样,面板将可用于该类的所有非静态方法。
答案 3 :(得分:0)
一种简单的方法是将范围视为包含变量声明的最近的括号。变量可以在这些大括号之间的任何位置访问。
因此,当你在构造函数中声明'panel'时,它只能在构造函数中访问;如果你在类中声明它,它将可以在任何类方法中访问。
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
..
}
}