2015-01-15 2 views
0

자식 개체에서 데이터를 설정할 수없는 경우 복합 개체에서 자식 개체의 부모 개체를 식별하기위한 표준 패턴이 있습니까? 창조시의 목표?자식 개체를 제어하지 않을 때 자식 개체에서 부모 개체 식별

나는 체스 모양의 보드를 만들고 있습니다. 보드는 그림 상자 그리드로 구성됩니다. 보드를 모델링하기 위해 그림 상자와 필요한 다른 데이터가 포함 된 "uxSquares"배열을 유지합니다. 유사한 예시 : 폼로드 중

private class uxSquare 
{ 
    public int RowIndex { get; private set; } 
    public int ColumnIndex { get; private set; } 

    // ... other stuff 

    public uxSquare(int RowIndex, int ColumnIndex) 
    { 
     this.RowIndex = RowIndex; 
     this.ColumnIndex = ColumnIndex; 
     this.PictureBox = new PictureBox(); 
     this.PictureBox.Name = "R" + RowIndex.ToString() + 
      "C" + ColumnIndex.ToString(); 
     } 
    } 

난 uxSquares의 2 차원 (행 COL) 배열을 생성하고, 그리드 레이아웃의 형태에 각각 uxSquare에서 그림 상자를 배치했다. 각 그림 상자의 생성과 함께, 위의 uxSquare 생성자에서 볼 수있는 그림 상자 이름에 uxSquares [,] 색인을 저장합니다.

for (int rowIndex = 0; rowIndex < countOfRows; rowIndex++) 
{ 
    for (int colIndex = 0; colIndex < countOfColumns; colIndex++) 
    { 
     // create the uxSquare array 
     uxSquares[rowIndex, colIndex] = new uxSquare(rowIndex, colIndex); 

     // ... place pictureBox in gridlayout, plus more stuff 
    } 
} 

픽쳐 박스에 사용자가 클릭, 나는 그 사진 상자 컨트롤을 소유하고 배열하는 uxSquare을 알 필요가

. 현재 그림 상자의 공유 클릭 처리기에서 Sender 개체의 이름을 구문 분석하여 uxSquares 인덱스를 가져옵니다.

이것은 컨트롤의 이름에 배열 인덱스를 유지하는 중대한 해킹처럼 보입니다. 그러나, 내 대안은 똑같이 엄청난 해킹처럼 보이는 uxSquare에 그림 상자 컨트롤을 매핑하는 별도의 조회 테이블을 유지하는 것으로 보입니다.

생성시 하위 개체의 데이터를 설정할 수없는 경우 복합 개체에서 자식 개체의 부모 개체를 식별하기위한 표준 패턴이 있습니까? 자식 객체를 소유했다면 부모 객체를 생성자에 전달하여 저장합니다. 그러나 PictureBox 컨트롤에 대한 그런 종류의 액세스 권한이 없습니다.

답변

1

그림 상자를 서브 클래스 화하고 행 및 열 인덱스를 생성자에 전달할 수 있습니다.

public class UxPicBox : PictureBox { 
    public UxPicBox(int col, int row) : base() { 
     this.Col = col; 
     this.Row = row; 
    } 

    public int Col { get; set; } 
    public int Row { get; set; }   

} 

그런 식으로 클릭 이벤트가 실행되면 보낸 사람을 UxPicBox로 캐스팅하고 UxSquare를 찾는 데 필요한 것을 얻을 수 있습니다.

편집 :이 클릭 이벤트

void UxPicBox_Click(object sender, EventArgs e) { 
    UxPicBox pb = (UxPicBox)sender; 
    MessageBox.Show(pb.Col.ToString() + " -- " + pb.Row.ToString()); 
} 
+0

허의 예입니다. 그게 ... 음, 간단 하네. 나는 이제 교통편을 이용하고 있는데, 책상으로 돌아 가면 이것을 시험해 보지만, 시험 해봤 니? UxPicBox에서 UserControl을 작성하지 않고도 UxPicBox로 Sender를 전송할 수 있습니다. 나는 이것이 약 30 시간 동안 시험 할 수 있어야한다. –

+0

나는 시험을 거쳤으며 나를 위해 일했다. 나는 답에 예제 클릭 이벤트를 추가했다. – jiverson

+0

와우, 나는 발신자 (이벤트 구조?)의 힘에 감명 받았다. 양식 컨트롤을 래핑하고 해당 데이터를 보낸 사람으로 전달할 수는 없습니다. 나는 미래에 심각한 코드 단순화를 볼 수있다. 감사! –

관련 문제