2016-09-16 56 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