페이지 트리
메타 데이터의 끝으로 건너뛰기
메타 데이터의 시작으로 이동

TreeView는 DataSet 의 부모-자식 키 컬럼을 이용해 계층(Tree) 구조로 표시하는 컨트롤입니다. 체크박스, 드래그&드롭, 인라인 편집, 컨텍스트 메뉴, Lazy-Load (자식 노드 동적 로딩), 라벨 기반 필터를 지원합니다.

구버전 Tree 컨트롤과 데이터 바인딩 방식은 동일하지만, TreeView 는 Canvas 기반으로 렌더링되어 대량 데이터에서도 부드러운 스크롤/그리기 성능을 제공합니다.

1. TreeView 컴포넌트 생성하기

i-AUD Designer 의 상단 컨트롤 메뉴에서 Tree 그룹을 펼쳐 TreeView를 클릭한 뒤, 화면의 원하는 위치에 드롭하여 컴포넌트를 배치합니다.


배치 후 우측 PropertyGrid 에서 다음 절에 설명할 속성들을 설정합니다.

2. TreeView 속성


구분상세 구분상세 설명
DataData SourceTree 에 바인딩할 DataSource 선택
Label Field화면에 표시할 텍스트(캡션) 컬럼명
Value Field각 노드의 고유 키(=PK) 컬럼명
Has Child Field서버 Lazy-Load 대상임을 표시할 컬럼명. 값이 'Y' / 1 / true 이면 자식 노드 존재로 표시되며, 펼치는 시점에 OnNodeBeforeExpand 이벤트 발생
Image Field노드 좌측 아이콘 이미지 경로 컬럼명
Parent Key Field부모 노드 키 컬럼명. 값이 비어 있으면 최상위 노드로 취급
Tool Tip Field마우스 오버 시 툴팁으로 표시할 컬럼명
BehaviorShow CheckBox체크박스 표시 여부
CheckBox Select Type체크 동작 방식. Hierarchy = 부모↔자식 자동 전파, SingleNode = 노드 단일 토글
Auto Expand LevelSetDataSet 직후 자동으로 펼칠 깊이 (0=루트만, 1=루트+자식 1단계 …)
Editable캡션 더블클릭으로 인라인 편집 허용 여부 ( OnTextChange 이벤트로 변경 값 수신)
Enable DragNDrop드래그&드롭으로 노드 위치 이동 허용 여부
Is Multi SelectCtrl/Shift 다중 선택 허용 여부
Row Height노드 한 줄 높이 (px)
Hover BackColor마우스 오버 노드 행 배경색

3. Lazy-Load (자식 노드 동적 로딩)

자식 데이터가 많거나 서버 호출 비용이 큰 경우, 펼치는 시점에 자식만 로딩하는 Lazy-Load 패턴을 사용합니다.

  1. 최상위 데이터 SQL 결과에 HAS_CHILD 컬럼을 포함시키고, 자식이 있는 행은 'Y' 로 채워 둡니다.
  2. PropertyGrid 의 Data > Has Child FieldHAS_CHILD 컬럼명을 설정합니다.
  3. 스크립트에서 OnNodeBeforeExpand 이벤트 안에서 자식 데이터를 조회하고 AppendTable(node, dataTable) 로 주입합니다.
var tree = Matrix.getObject("TREE_VIEW");

tree.OnNodeBeforeExpand = function (sender, e) {
    if (e.Node.IsChildLoaded) return;   // 이미 로드된 노드는 skip

    BizObject.READ_CHILD_LIST(e.Node.GetValue("KEY"), function (ds) {
        tree.AppendTable(e.Node, ds.GetTable(0));   // 자식 일괄 주입
    });
};

5. 스크립트 사용 예제

5.1 선택된 노드 가져오기

var tree = Matrix.getObject("TREE_VIEW");

tree.OnSelectedItemChanged = function (sender, e) {
    var lastNode = e.LastSelectedNode;
    if (lastNode) {
        var key   = lastNode.Key;
        var label = lastNode.Caption;
    }
};

5.2 체크된 노드 모두 수집

var tree = Matrix.getObject("TREE_VIEW");

function collectChecked(parent, out) {
    parent.GetChildNodeList().forEach(function (c) {
        if (c.IsChecked) out.push(c);
        collectChecked(c, out);
    });
}

var checked = [];
collectChecked(tree.RootNode, checked);

5.3 노드 동적 추가

var tree = Matrix.getObject("TREE_VIEW");
var node = tree.AppendRow("NEW_KEY", "PARENT_KEY");
node.SetValue("LABEL", "신규 항목");
tree.Update();

5.4 라벨 기반 필터

var tree    = Matrix.getObject("TREE_VIEW");
var txtFind = Matrix.getObject("TXT_FIND");

txtFind.OnTextKeydown = function (sender, e) {
    if (e.Event.isEnter()) tree.Filter(txtFind.Text);
};

// 필터 해제
// tree.Filter("");

6. 주요 이벤트

이벤트발생 시점 / 주요 args
OnSelectedItemChanged선택 노드 변경. e.SelectedNodes, e.LastSelectedNode
OnNodeClick노드 좌클릭. e.Node
OnNodeRightClick노드 우클릭 (ContextMenu 직전). e.Node
OnNodeDbClick노드 더블클릭. e.Node
OnNodeCheckboxClick체크박스 클릭. e.Row, e.Checked, e.Cancel
OnNodeBeforeExpand노드 펼치기 직전. Lazy-Load 진입 지점. e.Node
OnNodeAfterExpand노드 펼침 완료 직후. e.Node
OnNodeBeforeCollapsed노드 접기 직전. e.Node
OnNodeAfterCollapsed노드 접힘 완료 직후. e.Node
OnContextMenuOpening컨텍스트 메뉴 열림. e.Menu 로 동적 메뉴 구성
OnTextChange인라인 편집 후 Enter/포커스 아웃. e.SelectedRow, e.Value
OnStartDrag / OnDrag / OnStartDrop / OnEndDrop드래그&드롭 라이프사이클
OnCellLoaded각 노드가 화면에 처음 그려질 때

7. 주요 메소드

메소드설명
SetDataSet(ds)DataSet 바인딩. 첫 호출 시 AutoExpandLevel 깊이까지 자동 펼침
ClearDataSet() / Clear()전체 노드/데이터 초기화
AppendRow(key, parentKey)단일 노드 추가. 반환 TreeViewNode
AppendTable(parentNode, dataTable)parentNode 자식을 dataTable 로 일괄 주입 (Lazy-Load)
RemoveRow(key) / RemoveNode(code)노드 삭제
Expand(node) / Collapse(node)노드 단위 펼침/접기
ExpandAll() / CollapseAll()전체 펼침/접기
ExpandToLevel(depth)특정 깊이까지 펼침
FindAndFocus(key)키로 노드 검색 후 스크롤 + 포커스
Filter(keyword)라벨 부분일치 필터. 빈 문자열로 해제
GetTreeNode(key) / GetNode(key)키로 노드 조회
RefreshNode(node)Lazy-Load 노드 강제 재조회 (OnNodeBeforeExpand 재발생)
Refresh()DataSource 서버 재조회 + 바인딩
Update()다시 그리기
  • 레이블 없음