2014-06-18 5 views
1

10 x 10 그리드의 패널 배열이 있고 x 및 y 좌표로 각 패널 위치를 설명하면 어떻게 이것을 Panel.click 이벤트에 전달할 수 있습니까?winforms 패널의 그리드 좌표 전달

int sqSize = 80; 
int bAcross = 10; 
CPanels = new Panel[bAcross, bAcross]; //10 * 10 grid 

    for (int y = 0; y < bAcross; y++) 
    { 
     for (int x = 0; x < bAcross; x++) 
     { 
      var newPan = new Panel 
      { 
       Size = new Size(sqSize, sqSize), 
       Location = new Point(x * sqSize, y * sqSize) 
      }; 

      Controls.Add(newPan); 
      CPanels[x, y] = newPan; //add to correct location on grid 
      newPan.Click += Pan_Click; 

클릭 이벤트에서 나는 무엇을해야합니까?

private void Pan_Click(object sender, EventArgs e) 
{ 
    int x = (extract x coord) 
    int y = (extract y coord) 
} 

편집 : 명확하게하려면 표에서 위치를 찾고 있습니다. 기본적으로 그리드의 왼쪽 상단은 0, 0이어야하며, 오른쪽 아래는 10

답변

2

Pan_Click 이벤트를 발사 Panelsender 매개 변수에 사용할 수 있으며, 10해야한다 : 실제로 때문에

private void Pan_Click(object sender, EventArgs e) 
{ 
    var panel = sender as Panel; 
    if (panel == null) 
     return; 

    int x = panel.Location.X; 
    int y = panel.Location.Y; 
} 

10 × 10 그리드 관련하여 Panel의 위치를 ​​원하고, 당신은 그리드의 현재 위치에 따라 sqSize를 곱하여 각 Panel의 위치를 ​​설정하는 가입일 :

Location = new Point(x * sqSize, y * sqSize) 
,

당신은 단순히 각이 원래 xy 값을 얻기 위해 다시 sqSize에 의해 좌표 나눌 수 있습니다 :

private void Pan_Click(object sender, EventArgs e) 
{ 
    var panel = sender as Panel; 
    if (panel == null) 
     return; 

    int x = panel.Location.X/sqSize; 
    int y = panel.Location.Y/sqSize; 
} 

(이것은 10 × 10 그리드의 경우, 오른쪽 하단 모서리가 9,9-을하지 될 것 또한주의 10,10)

+1

그가 원하는지 또는 패널이 차지하고있는 배열 좌표를 얻는 지 확실하지 않은 경우 –

+1

@MarkHall 오, 좋은 지적입니다. 특정 패널이 차지하고있는 10x10 격자의 좌표를 알고 싶을 수도 있습니다. 데이비드 N, 너가 실제로 찾고있는거야? –

+0

다른 패널 (그리드)에 상대적으로 뭔가를 찾고있었습니다. 왼쪽 위처럼 0, 0이되어야합니다. 오른쪽 하단은 10, 10이어야합니다. –

관련 문제