2011-10-25 57 views
2
class Puzzle 
     { 
     private int PUZZLESIZE = 3; 
     private int col, row; 
     private Button[,] buttons; 

     public Puzzle() 
     { 
     } 

     public Puzzle(Form1 form1) 
     { 
      buttons = new Button[3, 3] 
      { { form1.button1, form1.button2, form1.button3 }, 
      { form1.button4, form1.button5, form1.button6 }, 
      { form1.button7, form1.button8, form1.button9 } };   
     } 

     public void reset() 
     { 
      for (int i = 0; i < 3; i++) 
       for (int j = 0; j < 3; j++) 
       { 
        buttons[i, j].BackColor = Color.Lime; 
       } 
     } 

buttons[i, j].BackColor = Color.Lime;的NullReferenceException爲按鈕陣列

此行導致NullReferenceException當我打電話在Form1.cs復位方法。任何建議表示讚賞!

+2

儘管按鈕屬性在窗體上可用,但它們可能尚未實例化,因此將爲空。這取決於您何時嘗試訪問它們。標準的WinForms行爲是在InitializeComponent中創建所有的控件,儘管這不是一成不變的。 –

+0

你確定你的代碼路徑沒有使用默認的構造函數,它不綁定按鈕? – jv42

+1

我會從刪除空的構造函數開始... – jv42

回答

3

兩個問題:

  • 這有可能是form1.button1(ETC)爲空。你應該在構造函數中驗證它。
  • 如果您調用無參數構造函數而不是Puzzle(Form1)構造函數,則buttons仍然爲空。我建議你擺脫無參數的構造函數。

我倒是建議您使用大括號所有循環,即

for (int i = 0; i < 3; i++) 
{ 
    for (int j = 0; j < 3; j++) 
    { 
     buttons[i, j].BackColor = Color.Lime; 
    } 
} 

是的,它需要更多的空間 - 但它更清晰,不易出錯在我的經驗。

0

你確定你在調用默認的構造函數嗎?它看起來像你的類需要一個Form1實例來運行,所以嘗試刪除默認的構造函數。如果它失敗了,你已經得到了你的答案!

+0

我認爲你是對的。但是我怎麼能在Form1.cs中用參數聲明一個謎題實例呢?益智拼圖=新拼圖(...); –

+0

你會寫'Puzzle puzzle = new Puzzle(this);' – Sean

+0

它說「關鍵字'this'在當前上下文中不可用」http://stackoverflow.com/questions/7883686/how-to-access-按鈕在其他類從form1-cs請檢查這一個。謝謝!!! –