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 참조
RealGrid HELP