当我在 form_load 中制作一个点矩阵时它可以工作,但是当我在一个单独的 class 中制作它并在 form_load 中制作它的对象时它不起作用
When I make a matrix of points in form_load it works, but when i make it in a separate class, and make an object of it in form_load it doesn`t work
所以我需要制作一个点矩阵来将按钮分布在一个区域上,我想制作一个具有矩阵本身的 class 因为按钮不会一直出现在屏幕上,它们会移动在网格等
无论如何,下面是 class 的构造函数的作用:
public Table()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
_Grid[i, j] = new Point(i * 90, j * 90);
}
}
}
90 是按钮的宽度
然后我有一个 属性 允许获取网格:
public Point[,] Grid
{
get;
}
然后我这样 form_load:
private void Form1_Load(object sender, EventArgs e)
{
Table tab = new Table();
Point[,] grid = tab.Grid;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Button btn = new Button();
btn.Width = 88;
btn.Height = 88;
btn.Location = grid[i, j]; // it returns a NullReferernceException here
panel1.Controls.Add(btn);
}
}
}
添加位置给了我一个空引用,但是如果我从构造函数复制代码并在 form_load 中制作网格矩阵,它就可以工作。(按钮宽度和高度是 88,所以有一个按钮之间的漂亮小 space)
我显然还在学习,你可以看到我卡在了这个项目的最开始,因为我什至不能让所有的按钮都出现在它们应该出现的地方。
这是一个猜测,但我怀疑你在 Table
中做过类似的事情
private Point[,] _Grid = new blahblahblah
public Point[,] Grid
{
get;
}
这两个东西在内存中引用的不是同一个东西 - 你已经填充了 _Grid
并且它是有效的对象,但是 属性 Grid
引用了一些不可见的后备存储编译器创建的变量;有一个相似的名字不足以将它们连接在一起
- 将 Table 更改为:
public Point[,] Grid { get; } = new blahblahblah
删除任何提及 _Grid
以支持 Grid
更改构造函数,使其通过 属性 设置数组(从而将值写入编译器创建的不可见支持字段):
Grid[i, j] = new Point(i * 90, j * 90);
然后检索 tab.Grid
将检索非空的已填充内容
脚注,我们将私有成员命名为 _camelCase
,而不是 _PascalCase
,如果您想显式声明一个只读的 属性 以获取 class 成员字段,它看起来像:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get { return _grid; }}
或:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get => _grid; }
即您必须通过让 prop 去并按名称获取该字段来将它们具体连接在一起,然后 return it
我们可以再次进入“属性不应该 return 数组”:D
所以我需要制作一个点矩阵来将按钮分布在一个区域上,我想制作一个具有矩阵本身的 class 因为按钮不会一直出现在屏幕上,它们会移动在网格等
无论如何,下面是 class 的构造函数的作用:
public Table()
{
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
_Grid[i, j] = new Point(i * 90, j * 90);
}
}
}
90 是按钮的宽度
然后我有一个 属性 允许获取网格:
public Point[,] Grid
{
get;
}
然后我这样 form_load:
private void Form1_Load(object sender, EventArgs e)
{
Table tab = new Table();
Point[,] grid = tab.Grid;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
Button btn = new Button();
btn.Width = 88;
btn.Height = 88;
btn.Location = grid[i, j]; // it returns a NullReferernceException here
panel1.Controls.Add(btn);
}
}
}
添加位置给了我一个空引用,但是如果我从构造函数复制代码并在 form_load 中制作网格矩阵,它就可以工作。(按钮宽度和高度是 88,所以有一个按钮之间的漂亮小 space)
我显然还在学习,你可以看到我卡在了这个项目的最开始,因为我什至不能让所有的按钮都出现在它们应该出现的地方。
这是一个猜测,但我怀疑你在 Table
中做过类似的事情private Point[,] _Grid = new blahblahblah
public Point[,] Grid
{
get;
}
这两个东西在内存中引用的不是同一个东西 - 你已经填充了 _Grid
并且它是有效的对象,但是 属性 Grid
引用了一些不可见的后备存储编译器创建的变量;有一个相似的名字不足以将它们连接在一起
- 将 Table 更改为:
public Point[,] Grid { get; } = new blahblahblah
删除任何提及
_Grid
以支持Grid
更改构造函数,使其通过 属性 设置数组(从而将值写入编译器创建的不可见支持字段):
Grid[i, j] = new Point(i * 90, j * 90);
然后检索 tab.Grid
将检索非空的已填充内容
脚注,我们将私有成员命名为 _camelCase
,而不是 _PascalCase
,如果您想显式声明一个只读的 属性 以获取 class 成员字段,它看起来像:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get { return _grid; }}
或:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get => _grid; }
即您必须通过让 prop 去并按名称获取该字段来将它们具体连接在一起,然后 return it
我们可以再次进入“属性不应该 return 数组”:D