Sorting

The FlexGrid control supports sorting via the source CollectionView. By default, clicking on any column header will sort the data based on the column that was clicked.

Clicking the same column header again will revert the sort order. Control-clicking the column header will remove the sort.

You may customize the sorting behavior using the grid's showSort and allowSorting properties.

Learn about FlexGrid | FlexGrid API Reference

app.js
index.html
styles.css
Copy to CodeMine
import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import './styles.css'; import * as wjGrid from '@mescius/wijmo.grid'; // document.readyState === 'complete' ? init() : window.onload = init; // function init() { // // generate some random data var countries = 'US,Germany,UK,Japan,Italy,Greece'.split(','), data = []; for (var i = 0; i < countries.length; i++) { data.push({ id: i, country: countries[i], downloads: Math.round(Math.random() * 20000), sales: Math.random() * 10000, expenses: Math.random() * 5000 }); } // var theGrid = new wjGrid.FlexGrid('#theGrid', { deferResizing: true, sortOrder: wjGrid.SortOrder.AscDesc, autoGenerateColumns: false, columns: [ { binding: 'id', header: 'ID', width: 60, allowSorting: false }, { binding: 'country', header: 'Country', sortOrder: wjGrid.SortOrder.AscDescNone }, { binding: 'sales', header: 'Sales', sortOrder: 'DescAsc' }, { binding: 'expenses', header: 'Expenses' } ], itemsSource: data }); // document.getElementById("cboFlexGridSortOrder").value = wjGrid.SortOrder[theGrid.sortOrder]; let cboColumns = document.getElementById("cboColumns"); let colList = document.getElementById("colList"); for (let c = 0; c < theGrid.columns.length; c++) { let col = theGrid.columns[c]; if (col.allowSorting) { cboColumns.options.add(new Option(col.header, c.toString())); } let sortOrder = theGrid.columns[c].sortOrder == null ? col.allowSorting ? 'Default' : 'null' : wjGrid.SortOrder[theGrid.columns[c].sortOrder]; let li = document.createElement('li'); let liContent = document.createElement('p'); liContent.innerHTML = col.header + " - <b>" + sortOrder + "</b>"; li.appendChild(liContent); colList.appendChild(li); } document.getElementById("cboFlexGridSortOrder").addEventListener('change', (s) => { theGrid.sortOrder = wjGrid.SortOrder[s.target.value]; }); document.getElementById("cboColumns").addEventListener('change', (s) => { if (s.target.value == "-1") document.getElementById("cboColumnSortOrder").setAttribute('disabled', 'disabled'); else { document.getElementById("cboColumnSortOrder").removeAttribute('disabled'); let selCol = document.getElementById('cboColumns').value; document.getElementById("cboColumnSortOrder").value = theGrid.columns[selCol].sortOrder == null ? null : wjGrid.SortOrder[theGrid.columns[selCol].sortOrder]; } }); document.getElementById("cboColumnSortOrder").addEventListener('change', (s) => { let selCol = document.getElementById('cboColumns').value; let selSortOrder = document.getElementById('cboColumnSortOrder').value; if (selCol != 'null') { theGrid.columns[selCol].sortOrder = selSortOrder == 'null' ? null : selSortOrder; } if (selSortOrder == 'null') selSortOrder = 'Default'; colList.children[selCol].innerHTML = theGrid.columns[selCol].header + " - <b>" + selSortOrder + "</b>"; }); }
import 'bootstrap.css'; import '@mescius/wijmo.styles/wijmo.css'; import './styles.css'; import * as wjGrid from '@mescius/wijmo.grid'; // document.readyState === 'complete' ? init() : window.onload = init; // function init() { // // generate some random data var countries = 'US,Germany,UK,Japan,Italy,Greece'.split(','), data = []; for (var i = 0; i < countries.length; i++) { data.push({ id: i, country: countries[i], downloads: Math.round(Math.random() * 20000), sales: Math.random() * 10000, expenses: Math.random() * 5000 }); } // var theGrid = new wjGrid.FlexGrid('#theGrid', { deferResizing: true, sortOrder: wjGrid.SortOrder.AscDesc, autoGenerateColumns: false, columns: [ { binding: 'id', header: 'ID', width: 60, allowSorting: false }, { binding: 'country', header: 'Country', sortOrder: wjGrid.SortOrder.AscDescNone }, { binding: 'sales', header: 'Sales', sortOrder: 'DescAsc' }, { binding: 'expenses', header: 'Expenses' } ], itemsSource: data }); // document.getElementById("cboFlexGridSortOrder").value = wjGrid.SortOrder[theGrid.sortOrder]; let cboColumns = document.getElementById("cboColumns"); let colList = document.getElementById("colList"); for (let c = 0; c < theGrid.columns.length; c++) { let col = theGrid.columns[c]; if (col.allowSorting) { cboColumns.options.add(new Option(col.header, c.toString())); } let sortOrder = theGrid.columns[c].sortOrder == null ? col.allowSorting ? 'Default' : 'null' : wjGrid.SortOrder[theGrid.columns[c].sortOrder]; let li = document.createElement('li'); let liContent = document.createElement('p'); liContent.innerHTML = col.header + " - <b>" + sortOrder + "</b>"; li.appendChild(liContent); colList.appendChild(li); } document.getElementById("cboFlexGridSortOrder").addEventListener('change', (s) => { theGrid.sortOrder = wjGrid.SortOrder[s.target.value]; }); document.getElementById("cboColumns").addEventListener('change', (s) => { if (s.target.value == "-1") document.getElementById("cboColumnSortOrder").setAttribute('disabled', 'disabled'); else { document.getElementById("cboColumnSortOrder").removeAttribute('disabled'); let selCol = document.getElementById('cboColumns').value; document.getElementById("cboColumnSortOrder").value = theGrid.columns[selCol].sortOrder == null ? null : wjGrid.SortOrder[theGrid.columns[selCol].sortOrder]; } }); document.getElementById("cboColumnSortOrder").addEventListener('change', (s) => { let selCol = document.getElementById('cboColumns').value; let selSortOrder = document.getElementById('cboColumnSortOrder').value; if (selCol != 'null') { theGrid.columns[selCol].sortOrder = selSortOrder == 'null' ? null : selSortOrder; } if (selSortOrder == 'null') selSortOrder = 'Default'; colList.children[selCol].innerHTML = theGrid.columns[selCol].header + " - <b>" + selSortOrder + "</b>"; }); }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>MESCIUS Wijmo FlexGrid Sorting</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <!-- SystemJS --> <script src="https://cdnjs.cloudflare.com/ajax/libs/systemjs/0.21.5/system.src.js" integrity="sha512-skZbMyvYdNoZfLmiGn5ii6KmklM82rYX2uWctBhzaXPxJgiv4XBwJnFGr5k8s+6tE1pcR1nuTKghozJHyzMcoA==" crossorigin="anonymous"></script> <script src="systemjs.config.js"></script> <script> System.import('./src/app'); </script> </head> <body> <div class="container-fluid"> <div class="panel-group"> <div class="panel panel-default"> <div class="panel-heading"> <h4 class="panel-title"> Set Sort Order </h4> </div> <div class="panel-body"> <ul class="list-inline"> <li>FlexGrid </li> <li> <select id="cboFlexGridSortOrder"> <option value="AscDesc" selected>AscDesc</option> <option value="DescAsc">DescAsc</option> <option value="AscDescNone">AscDescNone</option> <option value="DescAscNone">DescAscNone</option> </select> </li> </ul> <ul class="list-inline"> <li>Columns </li> <li> <select id="cboColumns"> <option value="-1" selected>--Select Column--</option> </select> </li> <li> <select id="cboColumnSortOrder" disabled> <option value="null" selected>Default</option> <option value="AscDesc">AscDesc</option> <option value="DescAsc">DescAsc</option> <option value="AscDescNone">AscDescNone</option> <option value="DescAscNone">DescAscNone</option> </select> </li> </ul> <ul class="list-inline" id="colList"> </ul> </div> </div> </div> <div id="theGrid"></div> </div> </body> </html>
.wj-flexgrid { height: 200px; margin:10px 0; }
(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', '@mescius/wijmo': 'npm:@mescius/wijmo/index.js', '@mescius/wijmo.input': 'npm:@mescius/wijmo.input/index.js', '@mescius/wijmo.styles': 'npm:@mescius/wijmo.styles', '@mescius/wijmo.cultures': 'npm:@mescius/wijmo.cultures', '@mescius/wijmo.chart': 'npm:@mescius/wijmo.chart/index.js', '@mescius/wijmo.chart.analytics': 'npm:@mescius/wijmo.chart.analytics/index.js', '@mescius/wijmo.chart.animation': 'npm:@mescius/wijmo.chart.animation/index.js', '@mescius/wijmo.chart.annotation': 'npm:@mescius/wijmo.chart.annotation/index.js', '@mescius/wijmo.chart.finance': 'npm:@mescius/wijmo.chart.finance/index.js', '@mescius/wijmo.chart.finance.analytics': 'npm:@mescius/wijmo.chart.finance.analytics/index.js', '@mescius/wijmo.chart.hierarchical': 'npm:@mescius/wijmo.chart.hierarchical/index.js', '@mescius/wijmo.chart.interaction': 'npm:@mescius/wijmo.chart.interaction/index.js', '@mescius/wijmo.chart.radar': 'npm:@mescius/wijmo.chart.radar/index.js', '@mescius/wijmo.chart.render': 'npm:@mescius/wijmo.chart.render/index.js', '@mescius/wijmo.chart.webgl': 'npm:@mescius/wijmo.chart.webgl/index.js', '@mescius/wijmo.chart.map': 'npm:@mescius/wijmo.chart.map/index.js', '@mescius/wijmo.gauge': 'npm:@mescius/wijmo.gauge/index.js', '@mescius/wijmo.grid': 'npm:@mescius/wijmo.grid/index.js', '@mescius/wijmo.grid.detail': 'npm:@mescius/wijmo.grid.detail/index.js', '@mescius/wijmo.grid.filter': 'npm:@mescius/wijmo.grid.filter/index.js', '@mescius/wijmo.grid.search': 'npm:@mescius/wijmo.grid.search/index.js', '@mescius/wijmo.grid.style': 'npm:@mescius/wijmo.grid.style/index.js', '@mescius/wijmo.grid.grouppanel': 'npm:@mescius/wijmo.grid.grouppanel/index.js', '@mescius/wijmo.grid.multirow': 'npm:@mescius/wijmo.grid.multirow/index.js', '@mescius/wijmo.grid.transposed': 'npm:@mescius/wijmo.grid.transposed/index.js', '@mescius/wijmo.grid.transposedmultirow': 'npm:@mescius/wijmo.grid.transposedmultirow/index.js', '@mescius/wijmo.grid.pdf': 'npm:@mescius/wijmo.grid.pdf/index.js', '@mescius/wijmo.grid.sheet': 'npm:@mescius/wijmo.grid.sheet/index.js', '@mescius/wijmo.grid.xlsx': 'npm:@mescius/wijmo.grid.xlsx/index.js', '@mescius/wijmo.grid.selector': 'npm:@mescius/wijmo.grid.selector/index.js', '@mescius/wijmo.grid.cellmaker': 'npm:@mescius/wijmo.grid.cellmaker/index.js', '@mescius/wijmo.nav': 'npm:@mescius/wijmo.nav/index.js', '@mescius/wijmo.odata': 'npm:@mescius/wijmo.odata/index.js', '@mescius/wijmo.olap': 'npm:@mescius/wijmo.olap/index.js', '@mescius/wijmo.rest': 'npm:@mescius/wijmo.rest/index.js', '@mescius/wijmo.pdf': 'npm:@mescius/wijmo.pdf/index.js', '@mescius/wijmo.pdf.security': 'npm:@mescius/wijmo.pdf.security/index.js', '@mescius/wijmo.viewer': 'npm:@mescius/wijmo.viewer/index.js', '@mescius/wijmo.xlsx': 'npm:@mescius/wijmo.xlsx/index.js', '@mescius/wijmo.undo': 'npm:@mescius/wijmo.undo/index.js', '@mescius/wijmo.interop.grid': 'npm:@mescius/wijmo.interop.grid/index.js', '@mescius/wijmo.touch': 'npm:@mescius/wijmo.touch/index.js', '@mescius/wijmo.cloud': 'npm:@mescius/wijmo.cloud/index.js', '@mescius/wijmo.barcode': 'npm:@mescius/wijmo.barcode/index.js', '@mescius/wijmo.barcode.common': 'npm:@mescius/wijmo.barcode.common/index.js', '@mescius/wijmo.barcode.composite': 'npm:@mescius/wijmo.barcode.composite/index.js', '@mescius/wijmo.barcode.specialized': 'npm:@mescius/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);