2016-09-16 59 views
1

我們有熄燈遊戲編程熄燈C#多維數組

 Button[,] lights = new Button[5,5]; 

      for (int i = 0; i < lights.GetLength(1); i++) 
      { 
       for (int j = 0; j < lights.GetLength(0); j++) 
       { 
        lights[i, j] = new Button(); 
        lights[i, j].Size = new System.Drawing.Size(50, 50); 
        lights[i, j].Click += (sender, args) => light_OnOff(lights[i,j], i, j); 
        lights[i, j].BackColor = Color.Yellow; 
        lightPanel.Controls.Add(lights[i, j]); 

        MessageBox.Show("I:"+Convert.ToString(i) + "J:" +Convert.ToString(j)); 
       } 
      } 
     } 

     public void light_OnOff(object sender, int i, int j) 
     { 
      if(lights[i, j].BackColor == Color.Yellow) 
      { 
       lights[i, j].BackColor = Color.Black; 
      } 
     } 
    } 
} 

我現在我遇到的問題是,它說,它的出Array範圍(指數),但我不知道爲什麼。也許你可以幫助我。

+0

在這行是異常拋出?無論如何,使用調試器時應該很容易發現問題,並檢查「i」和「j」是什麼。 – HimBromBeere

+0

只要我點擊應該在啓動「light_OnOff」方法時的「light Button」,就會顯示異常 –

+0

您是否嘗試調試該方法? – sachin

回答

1

而不是用你的方式創建事件,設置按鈕的名稱以將它們彼此分開。

 for (int i = 0; i < lights.GetLength(1); i++) 
     { 
      for (int j = 0; j < lights.GetLength(0); j++) 
      { 
       lights[i, j] = new Button(); 
       lights[i, j].Size = new System.Drawing.Size(50, 50); 
       lights[i, j].Name = "button" + i.ToString() + j.ToString(); // set name like this 
       lights[i, j].Click += autoGeneratedEventName_Click; //after "+=" hit tab twice visual studio will create event auto; 
       lights[i,j].Location = new Point(40 + (j*70), 20 + (i * 70)); 
       lights[i, j].BackColor = Color.Yellow; 
       this.panel1.Controls.Add(lights[i, j]); 

       //MessageBox.Show("I:" + Convert.ToString(i) + "J:" + Convert.ToString(j)); 
      } 
     } 

而在事件中,發件人將解決問題,您不需要將數組的索引發送到事件。 (也可以從按鈕的最後2個名稱中找到索引)

private void autoGeneratedEventName_Click(object sender, EventArgs e) 
     { 
      Button b = sender as Button; //Clicked object is a Button 
      if (b.BackColor == Color.Yellow) 
      { 
       b.BackColor = Color.Black; 
      } 
      label1.Text = b.Name; 
     } 

結果;

enter image description here

希望幫助,

+0

是的,它幫助了很多,現在我只需要弄清楚如何一次「停用」十字。 –

+0

只需在Event上添加其他語句,這不是什麼大不了的事。 @RonAmme – Berkay

0

您正在處理代碼中的所謂的 「關閉」。

lights[i, j].Click += (sender, args) => light_OnOff(lights[i,j], i, j); 

變量我& j是不是由lamdba表達複製,但作爲參考,它仍然存在這些循環結束後進行處理。因此,當點擊事件觸發時,它會使用最新的值i & j(5),這會導致數組範圍異常。

要獲得預期的行爲,你可以我&Ĵ複製到本地變量,像這樣:

int e = i; int f = j; 
lights[i, j].Click += (sender, args) => light_OnOff(lights, e, f); 

閱讀以瞭解更多信息:http://csharpindepth.com/Articles/Chapter5/Closures.aspx