C13 Tree그리드에서 특정 데이터가 있는 노드를 찾아서 펼치기.
들어가며
이 강좌에서는 원하는 데이터가 들어있는 노드를 찾고 그 노드의 상위노드를 찾아 펼치는 것을 배워보겠습니다.
이론
그리드에서 데이터를 검색하기 위해 GridBase 기반으로 searchItem(), searchCell() 두 개의 검색 함수를 사용할 수 있습니다. 그러나 이 기능은 그리드에 보여지는 데이터를 대상으로 검색을 수행하기 때문에 트리의 접혀져있는 데이터들은 검색할 수 없습니다.
이런 경우는 모든 데이터들 검색하기 위해서는 별도로 dataProvider에서 검색을 수행해야 합니다.
여기서 조심해야 할 것이 일반 그리드의 경우 rowId는 0부터 시작해서 순차적으로 1씩 증가하나 트리 그리드의 경우는 0부터 시작하지 않고
순차적으로 1씩 증가하지 않을 수 있습니다. root Node에 물려있는 첫번째 노드들의 rowId가 2, 6, 10, 21 이런 식으로 배정될 수 있습니다.
이런 것을 감안해서 값을 검색해보는 코드를 작성해보도록 하겠습니다. 관련된 강좌로 B9-5 TreeView - 자식/자손/조상의 RowId 값 가져오기.을 먼저 선행 습득하시기 바랍니다.
B9-5 강좌를 보셨다면 모든 트리그리드의 Root ID는 -1 인 것을 인지하고 계시리라 생각됩니다. 데이터 검색은 dataProvider.getChildren(-1) 함수로 1 Level 노드들만 가져오고 각 노드들의 모든 자손들을 가져와서 값을 찾는 방법으로 코드를 작성하도록 하겠습니다.
실습
아래 코드는 price가 9999999 자료를 찾아 expand 하는 코드 입니다.
function treeSearch() { var searchData = 99999999; var parentIds = dataProvider.getChildren(-1); for (var i in parentIds) { var descendantIds = dataProvider.getDescendants(parentIds[i]); for (var j in descendantIds) { var fldData = dataProvider.getValue(descendantIds[i], 'price'); if (searchData == fldData) { var ancestorIds = dataProvider.getAncestors(descendantIds[i]); for(var k = ancestorIds.length - 1 ; k >= 0 ; k--) { var itemIndex = treeView.getItemIndex[ancestorIds[k]]; treeView.expand(itemIndex); } } } } }
아래 코드는 버튼의 클릭 이벤트 입니다.
$("#btnSearch").click(function(){ treeSearch(); });
실행화면
- 버튼을 누르면 price 가 9999999 인 값을 찾아 트리를 펼칩니다.
전체 소스코드
SCRIPT
<script type="text/javascript" src="/script/realgridjs-lic.js"></script> <script type="text/javascript" src="/script/realgridjs_eval.1.0.14.min.js"></script> <script type="text/javascript" src="/script/realgridjs-api.1.0.14.js"></script> <script language="javascript"> var treeView; var dataProvider; var rows = [ ["ko","국내"] ,["ko.co", "컴퓨터"] ,["ko.co.001", "인텔 SSD 520 120GB", 63900] ,["ko.co.002", "LED 게이밍키보드", 29700] ,["ko.co.003", "팩스무선레이저복합기", 119000] ,["ko.bo", "서적"] ,["ko.bo.001", "미움받을 용기", 13410] ,["ko.bo.002", "기탄 세계명작동화50권", 69000] ,["ko.sw", "프로그램"] ,["ko.sw.001", "리얼그리드", 9999999] ,["ov", "해외"] ,["ov.ha", "가전"] ,["ov.ha.001", "32G Amazon phone", 130] ,["ov.ha.002", "TDK- Wireless Speaker", 49.99] ,["ov.ha.003", "대륙의 실수 QCY QY5s", 18.59] ,["ov.tv", "TV/영상"] ,["ov.tv.001", "LG 55LF6000", 498] ,["ov.tv.002", "Samsung Smart LED FHD 60\"", 897.99] ]; $(document).ready( function() { RealGridJS.setTrace(false); RealGridJS.setRootContext("/script"); dataProvider = new RealGridJS.LocalTreeDataProvider(); treeView = new RealGridJS.TreeView("realgrid"); treeView.setDataSource(dataProvider); dataProvider.setFields([{ fieldName: "tree" }, { fieldName: "product" }, { fieldName: "price" }]); treeView.setColumns([{ name: "product", fieldName: "product", width: 200 }, { name: "price", fieldName: "price" }]); dataProvider.setRows(rows, "tree", false); function treeSearch() { var searchData = 9999999; var parentIds = dataProvider.getChildren(-1); for (var i in parentIds) { var descendantIds = dataProvider.getDescendants(parentIds[i]); for (var j in descendantIds) { var fldData = dataProvider.getValue(descendantIds[j], 'price'); if (searchData == fldData) { var ancestorIds = dataProvider.getAncestors(descendantIds[j]); for(var k = ancestorIds.length - 1 ; k >= 0 ; k--) { var itemIndex = treeView.getItemIndex(ancestorIds[k]); treeView.expand(itemIndex); } } } } } $("#btnSearch").click(function () { treeSearch() }); }); </script>
HTML
1. <input type="button" class="btn btn-primary btn-xs" id="btnSearch" value="Search" /> 버튼을 누르면 price 가 9999999 인 값을 찾아 트리를 펼칩니다. <div id="realgrid" style="width: 100%; height: 200px;"></div>
관련 데모 페이지
API 참조