2014-06-18 5 views
0

나는 나무를 저장하는 데 사용되는 Node 클래스가 있습니다. 텍스트는 Node 값을 저장하고 Children은 하위 트리를 저장합니다. 내가 먼저 나무를 평평하게하고클래스 사이의 바인딩

1-2-3 
1-2-4 
1-5-6 

지금이 바인딩 오전에 평평 예

를 들어 DataTable을

public class Node 
{ 
    public string Text { get; set; } 
    public List<Node> Children { get; set; } 
} 

 1 
    /\ 
    2 5 
/\ \ 
3 4 6 

를 저장하여, DataTable을에 나무를 coverting하고 DataTable을 DataGrid로 변환합니다. 사용자가 DataGrid의 값을 변경하면 DataTable에서 변경되지만 내 Tree에서도 변경됩니다. 노드와 Datatable 두 클래스간에 바인딩이있을 수 있는지 묻는 오전.

+0

왜 'Child'라는 단수 이름으로 컬렉션 속성을 명명 했습니까? 확실히 그것이 '어린이들 (Children)'이라면 더 합리적 일 것입니다. – Sheridan

답변

3

내가 먼저 나무를 평평없이 혜택을, 당신은 왜 자발적으로 당신의 일을 더 복잡하게 만들 것 DataTable을

에 저장하여, DataTable을에 나무를 coverting 무엇입니까? 데이터를 변환 (또는 '평평하게')하지 말고 DataTable을 사용하여 데이터를 보유하지 말고 DataGrid에 표시하지 않습니다. 내 계층 데이터를 평평하게한다면 을 묻습니다. 평평한 데이터를 변경하면 계층 적으로 표시 될 수 있습니까? 그 대답은 예 ...하지만 많은 일을합니다..

더 나은 옵션은 계층 적 데이터를 계층 적 형식으로 유지 한 다음 TreeView 또는 다른 계층 적 방식으로 표시하는 것입니다. 실제 데이터 인 데이터를 자연스러운 형식으로 바인딩하면 변경 내용이 예상대로 데이터 요소로 전파 될 수 있습니다.

+0

감사하지만 내 요구 사항은 이와 같습니다. 모든 부모 노드 텍스트가있는 리프 노드를 표시해야합니다. 사용자 정의 컨트롤을 만들면 내 문제가 해결됩니까? 나는 DataGrid와 Node 클래스를 직접 바인딩하는 방법을 찾고있다. –

0

DB 구조가 다소 복잡합니다. IMO 개체를 부모 키/값 쌍으로 정의해야하므로 전체 트리를 다시 읽지 않고 단일 값을 편집 할 수 있습니다. 또한 단일 선택 쿼리를 호출하여 하위 항목 목록을 쉽게 가져올 수 있습니다. 트리의 값이 다른 경우 기본 키로 값을 위협 할 수 있습니다. 트리를 넘어 반복 할 수 있다면 고유 한 ID 키를 저장하기 위해 추가로 세 번째 필드가 필요합니다.

어떤 종류의 DataGrid 액세스가 사용 중인지 잘 모르겠지만 f.e. LinqToSql을 사용하면 엔티티 정의를 포함하는 데이터 모델 컨텍스트를 생성 할 수 있습니다. 그런 다음 편집 (또는 파생)하여 List<Node> Children을 비 db 필드로 사용자 정의 게터로 추가하여 일부 게으른 하위 항목 컬렉션을 반환 할 수 있습니다.