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

이벤트에 else 문을 추가하기 만하면 큰 문제는 아닙니다. @RonAmme – Berkay

0

당신은 당신의 코드에서 소위 "폐쇄"로 취급하고, 도움이됩니다.

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

변수 내가 & J는 lamdba 발현에 의해 복사하지만, 이러한 루프가 종료 된 후 여전히 존재 참조로 처리되지 않습니다. 따라서 클릭 이벤트가 발생하면 i & j (5)의 최신 값을 사용하므로 배열 범위 예외를 벗어납니다.

이 예상되는 동작을 얻으려면, 당신은 다음과 같이, 지역 변수에 내가 & J를 복사 할 수 있습니다 :

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

자세한 내용은이 읽기 : http://csharpindepth.com/Articles/Chapter5/Closures.aspx