所以我需要制作一個點矩陣來將按鈕分布在一個區域上,我想制作一個具有矩陣本身的類,因為按鈕不會一直出現在螢屏上,它們會在網格中移動等。
無論如何,這是該類的建構式的作用:
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,所以按鈕之間的空間很小)
我顯然還在學習,你可以看到我在這個專案的一開始就卡住了,因為我什至不能讓所有的按鈕出現在它們應該出現的地方。
uj5u.com熱心網友回復:
這是一個猜測,但我懷疑你在 Table 中做過類似的事情
private Point[,] _Grid = new blahblahblah
public Point[,] Grid
{
get;
}
這兩件事不是指記憶體中的同一個東西——你已經填充_Grid并且它是有效的物件,但是該屬性Grid參考了一些由編譯器創建的不可見的后備存盤變數;具有相似的名稱不足以將它們連接在一起
- 將表更改為:
public Point[,] Grid { get; } = new blahblahblah
洗掉任何提及有
_Grid利于Grid更改建構式,使其通過屬性設定陣列(從而將值寫入編譯器創建的不可見支持欄位):
Grid[i, j] = new Point(i * 90, j * 90);
然后檢索tab.Grid將檢索一個不為空的填充的東西
腳注,我們將私有成員命名為_camelCase, not _PascalCase,如果你想顯式宣告一個獲取類成員欄位的只讀屬性,它看起來像:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get { return _grid; }}
要么:
private Point[,] _grid = blahblahblah;
public Point[,] Grid { get => _grid; }
即,您必須通過讓道具去按名稱獲取該欄位并回傳它來將它們具體連接在一起
我們可以再次進入“屬性不應回傳陣列”:D
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/443391.html
