편집 가능한 트리 그리드(TreeGrid)

FlexGrid의 childItemsPath를 사용하여 데이터를 TreeGrid로 표시하는 경우 결과 그리드는 기본적으로 읽기 전용이 됩니다. 이는 TreeGrid의 모든 행이 GroupRow이고 그룹 행이 기본적으로 읽기 전용이기 때문에 발생합니다. TreeGrid를 편집할 수 있도록 하려면 loadedRows 이벤트를 처리하여 모든 행의 isReadOnly 속성을 false로 설정합니다. FlexGrid의 childItemsPath를 사용하여 데이터를 TreeGrid로 표시하는 경우 결과 그리드는 기본적으로 읽기 전용이 됩니다. 이는 TreeGrid의 모든 행이 GroupRow이고 그룹 행이 기본적으로 읽기 전용이기 때문에 발생합니다. TreeGrid를 편집할 수 있도록 하려면 loadedRows 이벤트를 처리하여 모든 행의 isReadOnly 속성을 false로 설정합니다.

FlexGrid API 문서

import 'bootstrap.css'; import '@grapecity/wijmo.styles/wijmo.css'; import './styles.css'; import * as wjGrid from '@grapecity/wijmo.grid'; // document.readyState === 'complete' ? init() : window.onload = init; // function init() { // // workers tree data (heterogeneous collection) var workers = [{ name: 'Jack Smith', checks: [{ name: 'check1', earnings: [ { name: 'hourly', hours: 30.0, rate: 15.0 }, { name: 'overtime', hours: 10.0, rate: 20.0 }, { name: 'bonus', hours: 5.0, rate: 30.0 } ] }, { name: 'check2', earnings: [ { name: 'hourly', hours: 20.0, rate: 18.0 }, { name: 'overtime', hours: 20.0, rate: 24.0 } ] }] }, { name: 'Jack Smith', checks: [{ name: 'check1', earnings: [ { name: 'hourly', hours: 30.0, rate: 15.0 }, { name: 'overtime', hours: 10.0, rate: 20.0 }, { name: 'bonus', hours: 5.0, rate: 30.0 } ] }, { name: 'check2', earnings: [ { name: 'hourly', hours: 20.0, rate: 18.0 }, { name: 'overtime', hours: 20.0, rate: 24.0 } ] }] }, { name: 'Jane Smith', checks: [{ name: 'check1', earnings: [ { name: 'hourly', hours: 30.0, rate: 15.0 }, { name: 'overtime', hours: 10.0, rate: 20.0 }, { name: 'bonus', hours: 5.0, rate: 30.0 } ] }, { name: 'check2', earnings: [ { name: 'hourly', hours: 20.0, rate: 18.0 }, { name: 'overtime', hours: 20.0, rate: 24.0 } ] }] }]; // // workers tree var workersGrid = new wjGrid.FlexGrid('#workersGrid', { headersVisibility: 'Column', selectionMode: 'Row', childItemsPath: ['checks', 'earnings'], autoGenerateColumns: false, columns: [ { binding: 'name', isReadOnly: true }, { binding: 'hours', dataType: 'Number', format: 'n2' }, { binding: 'rate', dataType: 'Number', format: 'n2' } ], loadedRows: function (s, e) { s.rows.forEach(function (row) { row.isReadOnly = false; }); }, beginningEdit: function (s, e) { var item = s.rows[e.row].dataItem, binding = s.columns[e.col].binding; if (!(binding in item)) { // property not on this item? e.cancel = true; // can't edit! } }, itemsSource: workers }); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo FlexGrid Editable Tree Grid</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="node_modules/systemjs/dist/system.src.js"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <div id="workersGrid"></div> </div> </body> </html>
.wj-flexgrid { max-height: 220px; margin: 10px; } .wj-cell.wj-group { border: none; } .wj-cell.wj-group:not(.wj-state-selected):not(.wj-state-multi-selected) { background-color: white; } body { margin-bottom: 24px; }
(function (global) { System.config({ transpiler: 'plugin-babel', babelOptions: { es2015: true }, meta: { '*.css': { loader: 'css' } }, paths: { // paths serve as alias 'npm:': 'node_modules/' }, // map tells the System loader where to look for things map: { 'jszip': 'npm:jszip/dist/jszip.js', '@grapecity/wijmo': 'npm:@grapecity/wijmo/index.js', '@grapecity/wijmo.input': 'npm:@grapecity/wijmo.input/index.js', '@grapecity/wijmo.styles': 'npm:@grapecity/wijmo.styles', '@grapecity/wijmo.cultures': 'npm:@grapecity/wijmo.cultures', '@grapecity/wijmo.chart': 'npm:@grapecity/wijmo.chart/index.js', '@grapecity/wijmo.chart.analytics': 'npm:@grapecity/wijmo.chart.analytics/index.js', '@grapecity/wijmo.chart.animation': 'npm:@grapecity/wijmo.chart.animation/index.js', '@grapecity/wijmo.chart.annotation': 'npm:@grapecity/wijmo.chart.annotation/index.js', '@grapecity/wijmo.chart.finance': 'npm:@grapecity/wijmo.chart.finance/index.js', '@grapecity/wijmo.chart.finance.analytics': 'npm:@grapecity/wijmo.chart.finance.analytics/index.js', '@grapecity/wijmo.chart.hierarchical': 'npm:@grapecity/wijmo.chart.hierarchical/index.js', '@grapecity/wijmo.chart.interaction': 'npm:@grapecity/wijmo.chart.interaction/index.js', '@grapecity/wijmo.chart.radar': 'npm:@grapecity/wijmo.chart.radar/index.js', '@grapecity/wijmo.chart.render': 'npm:@grapecity/wijmo.chart.render/index.js', '@grapecity/wijmo.chart.webgl': 'npm:@grapecity/wijmo.chart.webgl/index.js', '@grapecity/wijmo.chart.map': 'npm:@grapecity/wijmo.chart.map/index.js', '@grapecity/wijmo.gauge': 'npm:@grapecity/wijmo.gauge/index.js', '@grapecity/wijmo.grid': 'npm:@grapecity/wijmo.grid/index.js', '@grapecity/wijmo.grid.detail': 'npm:@grapecity/wijmo.grid.detail/index.js', '@grapecity/wijmo.grid.filter': 'npm:@grapecity/wijmo.grid.filter/index.js', '@grapecity/wijmo.grid.search': 'npm:@grapecity/wijmo.grid.search/index.js', '@grapecity/wijmo.grid.grouppanel': 'npm:@grapecity/wijmo.grid.grouppanel/index.js', '@grapecity/wijmo.grid.multirow': 'npm:@grapecity/wijmo.grid.multirow/index.js', '@grapecity/wijmo.grid.transposed': 'npm:@grapecity/wijmo.grid.transposed/index.js', '@grapecity/wijmo.grid.transposedmultirow': 'npm:@grapecity/wijmo.grid.transposedmultirow/index.js', '@grapecity/wijmo.grid.pdf': 'npm:@grapecity/wijmo.grid.pdf/index.js', '@grapecity/wijmo.grid.sheet': 'npm:@grapecity/wijmo.grid.sheet/index.js', '@grapecity/wijmo.grid.xlsx': 'npm:@grapecity/wijmo.grid.xlsx/index.js', '@grapecity/wijmo.grid.selector': 'npm:@grapecity/wijmo.grid.selector/index.js', '@grapecity/wijmo.grid.cellmaker': 'npm:@grapecity/wijmo.grid.cellmaker/index.js', '@grapecity/wijmo.nav': 'npm:@grapecity/wijmo.nav/index.js', '@grapecity/wijmo.odata': 'npm:@grapecity/wijmo.odata/index.js', '@grapecity/wijmo.olap': 'npm:@grapecity/wijmo.olap/index.js', '@grapecity/wijmo.rest': 'npm:@grapecity/wijmo.rest/index.js', '@grapecity/wijmo.pdf': 'npm:@grapecity/wijmo.pdf/index.js', '@grapecity/wijmo.pdf.security': 'npm:@grapecity/wijmo.pdf.security/index.js', '@grapecity/wijmo.viewer': 'npm:@grapecity/wijmo.viewer/index.js', '@grapecity/wijmo.xlsx': 'npm:@grapecity/wijmo.xlsx/index.js', '@grapecity/wijmo.undo': 'npm:@grapecity/wijmo.undo/index.js', '@grapecity/wijmo.interop.grid': 'npm:@grapecity/wijmo.interop.grid/index.js', '@grapecity/wijmo.touch': 'npm:@grapecity/wijmo.touch/index.js', '@grapecity/wijmo.cloud': 'npm:@grapecity/wijmo.cloud/index.js', '@grapecity/wijmo.barcode': 'npm:@grapecity/wijmo.barcode/index.js', '@grapecity/wijmo.barcode.common': 'npm:@grapecity/wijmo.barcode.common/index.js', '@grapecity/wijmo.barcode.composite': 'npm:@grapecity/wijmo.barcode.composite/index.js', '@grapecity/wijmo.barcode.specialized': 'npm:@grapecity/wijmo.barcode.specialized/index.js', 'jszip': 'npm:jszip/dist/jszip.js', 'bootstrap.css': 'npm:bootstrap/dist/css/bootstrap.min.css', 'css': 'npm:systemjs-plugin-css/css.js', 'plugin-babel': 'npm:systemjs-plugin-babel/plugin-babel.js', 'systemjs-babel-build':'npm:systemjs-plugin-babel/systemjs-babel-browser.js' }, // packages tells the System loader how to load when no filename and/or no extension packages: { src: { defaultExtension: 'js' }, "node_modules": { defaultExtension: 'js' }, } }); })(this);