- データをグリッドに追加する前に、データを並べ替える必要があります。(私の知る限り)データを理解してソートできる組み込み関数はありません。Binary Search Treeを使用する場合は、左の葉でソートするだけでよいと思います。他のツリー構造では、おそらくデータをループしたり、再帰的な SQL クエリを記述して並べ替えたりする必要があります。
データは順序付けされる必要があるため、ツリーのソートをサポートする簡単な方法はありません。基本的な並べ替えでは、構造化データが破壊されます。ただし、データsortOrderにプロパティがある場合は、データを並べ替えることができるはずです。レベル 1 のノードがすべてsortOrder = 1、レベル 2 のノードがsortOrder = 2などの場合、最初にソート順で並べ替え、次に列で昇順または降順で並べ替えます。マルチカラムソートをチェックして、これを行う方法をよく理解してください。
grid.onSort.subscribe(function (e, args) {
var cols = args.sortCols;
data.sort(function (dataRow1, dataRow2) {
//first sort by your parameter, then combine it with example sort:
var sortOrderResult = (dataRow1["sortOrder"] == dataRow2["sortOrder"] ? 0
: (dataRow1["sortOrder"] > dataRow2["sortOrder"] ? 1 : -1));
if(sortOrderResult != 0)
return sortOrderResult;
else {
var field = cols[i].sortCol.field;
var sign = cols[i].sortAsc ? 1 : -1;
var value1 = dataRow1[field], value2 = dataRow2[field];
var result = (value1 == value2 ? 0 : (value1 > value2 ? 1 : -1)) * sign;
if (result != 0) {
return result;
}
}
}
});
ツリーの列の並べ替えを試みる場合は、次の点を考慮してください。
例 5を見ると、フィルターとフォーマッターの両方が実装されているため、データを並べ替える必要があることがわかります。
フィルター:
//part of the filter.
var parent = dataViewData[item.parent];
while (parent) {
if (parent._collapsed) {
parent._collapsed = false;
}
parent = dataViewData[parent.parent];
}
そして、ここにフォーマッタの一部があります:
//part of the formatter for showing collapse/open nodes
if (dataViewData[idx + 1] && dataViewData[idx + 1].indent > dataViewData[idx].indent) {
if (dataContext._collapsed) {
return spacer + " <span class='toggle expand'></span> " + value;
} else {
//.......
}
}
dataView内のデータの順序をチェックする代わりに、実際のIDを使用するようにこれらを書き直しました。これには、すべてのデータをループして、現在のノードに子があるかどうかを確認する必要があります。また、dataViewData[ idx ] 呼び出しを置き換える必要があります。
//instead of dataViewData[item.parent];
var parent = dataView.getItemById(item.parent);
これにより、ノードがソートされていなくてもツリーが機能しますが、ノードを展開すると、子はおそらく存在しない別のノードの後に配置されます。
ヘッダー フィルター検索を実装する必要がある場合は、数日前にここで別の質問に回答しました。