[]
By default, the FlexGrid applies merging to cells based on their content. In some cases, you may want to use different strategies for merging.
You can achieve this by defining a class that extends the wijmo.grid.MergeManager class and assigning an object of that type to the grid's mergeManager property.
This example illustrates by creating a grid that looks like a TV guide.
Notice how the custom merge manager creates merged ranges that span both rows and columns. This is something the default merge manager does not do.
// create an unbound grid with 5 rows and 7 columns var theGrid = new wijmo.grid.FlexGrid('#theGrid'); while (theGrid.columns.length < 7) { theGrid.columns.push(new wijmo.grid.Column()); } while (theGrid.rows.length < 5) { theGrid.rows.push(new wijmo.grid.Row()); } // configure the grid theGrid.mergeManager = new wijmo.grid.CustomMergeManager(theGrid); theGrid.formatItem.addHandler(centerCell); theGrid.rowHeaders.columns[0].width = 80; theGrid.rows.defaultSize = 40; theGrid.showAlternatingRows = false; theGrid.isReadOnly = true; // populate the grid setData(theGrid.columnHeaders, 0, ',Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday'.split(',')); setData(theGrid.cells, 0, '12:00,Walker,Morning Show,Morning Show,Sport,Weather,N/A,N/A'.split(',')); setData(theGrid.cells, 1, '13:00,Today Show,Today Show,Sesame Street,Football,Market Watch,N/A,N/A'.split(',')); setData(theGrid.cells, 2, '14:00,Today Show,Today Show,Kid Zone,Football,Soap Opera,N/A,N/A'.split(',')); setData(theGrid.cells, 3, '15:00,News,News,News,News,News,N/A,N/A'.split(',')); setData(theGrid.cells, 4, '16:00,News,News,News,News,News,N/A,N/A'.split(',')); } function setData(p, r, cells) { if (p.cellType == wijmo.grid.CellType.Cell) { p.grid.rowHeaders.setCellData(r, 0, cells[0]); } for (var i = 1; i < cells.length; i++) { p.setCellData(r, i - 1, cells[i]); } } function centerCell(s, e) { if (e.cell.children.length == 0) { e.cell.innerHTML = '<div>' + e.cell.innerHTML + '</div>'; wijmo.setCss(e.cell, { display: 'table', tableLayout: 'fixed' }); wijmo.setCss(e.cell.children[0], { display: 'table-cell', textAlign: 'center', verticalAlign: 'middle' }); } // CustomMergeManager class (transpiled from TypeScript) var __extends = (this && this.__extends) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; var wijmo; (function (wijmo) { var grid; (function (grid) { 'use strict'; /** * Class that extends the standard MergeManager to support merged ranges that * span both rows and columns. * * This class uses the same content-based approach used by the built-in merge * manager, but it could use any other logic instead (for example, a fixed list * of pre-defined merged ranges). */ var CustomMergeManager = (function (_super) { __extends(CustomMergeManager, _super); function CustomMergeManager() { _super.apply(this, arguments); } CustomMergeManager.prototype.getMergedRange = function (panel, r, c, clip) { if (clip === void 0) { clip = true; } // create basic cell range var rg = new grid.CellRange(r, c); // expand left/right for (var i = rg.col; i < panel.columns.length - 1; i++) { if (panel.getCellData(rg.row, i, true) != panel.getCellData(rg.row, i + 1, true)) break; rg.col2 = i + 1; } for (var i = rg.col; i > 0; i--) { if (panel.getCellData(rg.row, i, true) != panel.getCellData(rg.row, i - 1, true)) break; rg.col = i - 1; } // expand up/down for (var i = rg.row; i < panel.rows.length - 1; i++) { if (panel.getCellData(i, rg.col, true) != panel.getCellData(i + 1, rg.col, true)) break; rg.row2 = i + 1; } for (var i = rg.row; i > 0; i--) { if (panel.getCellData(i, rg.col, true) != panel.getCellData(i - 1, rg.col, true)) break; rg.row = i - 1; } // done return rg; }; return CustomMergeManager; }(grid.MergeManager)); grid.CustomMergeManager = CustomMergeManager; })(grid = wijmo.grid || (wijmo.grid = {})); })(wijmo || (wijmo = {}));