Cell spanning

TreeGrid documentation

Cells in TreeGrid can be spanned horizontally among columns, vertically among rows or in both directions together.
Since version 7.0 it is not possible to cross vertical and horizontal span, it is possible only to span rectangular areas.

Horizontal spanning among columns

Cells cannot be spanned between column sections (Left, Mid, Right).
It is possible to drag column into spanned range, the dropped column will get the span setting from the range.
It is possible to drag column outside spanned range, the dropped column will loose its col span and the cells become displayed.
It is possible to drag column inside the spanned range.
If you permit column moving between spanned columns, you should forbid saving the changes to cookies by <Cfg ColsPosLap='1'/>.
If grid contains any spanned cells between columns (<I Spanned='1'/>), the column moving is done by re-rendering whole grid.
<I> bool

Spanned

[0]
If the row contains any horizontally spanned cells among columns (marked with Span attribute).
Every row that contains some spanned or merged cells among columns must have set Spanned="1", otherwise the cell Span, Merge or MergeEdit attributes will be ignored.
upd 6.0 <I cell> int

Span

[0]
The name is not ColSpan, but Span only!
For horizontally spanned cell among columns, how many cells it covers, at least one. Including hidden columns.
The row with spanned cell must have set Spanned='1', otherwise the attribute is ignored.
In the whole spanned cell is shown value of this column. It can be changed by Merge attribute.
chg 6.0 <I cell> string[]

Merge

To show more or other values in one cell. A comma separated list of column names to show in the cell.
The row with merged cell must have set Spanned='1', otherwise the attribute is ignored.
The cell will show values from all the row cells from the columns listed. The way of showing is specified by MergeFormat and MergeType.
The attribute is intended to show more values in spanned cell, but can be used also for display other or more values in any cell.
This attribute is ignored in export to Excel.
new 6.4 <I cell> string

MergeFormat

If set, it specifies full HTML for display the merged values. The column names are replaced by the cell values.
If not set, the cell values are merged in <table> according to the 1. bit of MergeType.
For example "Path/Name.Ext" can be used for file path, where Path, Name and Ext are column names.
new 6.4 <I cell> string

MergeFormatXXX

Special MergeFormats used for particular Merge columns combination when some of the cells are empty.
Can be used to better specify what will be excluded from format instead of MergeType='4'.
The XXX are column names that are not empty for this row in the same order as in Merge.
For example for Merge='Path/Name.Ext' can be MergeFormatNameExt used when Path is empty.
new 6.4 <I cell> string

MergeFormatEmpty

MergeFormat use when all merged cells are empty.
new 6.4 <I cell> string

MergeEditFormat

MergeFormat used for editing. Set it especially when MergeFormat contains HTML code. If not set, the MergeFormat is used instead.
new 6.4 <I cell> string

MergeEditFormatXXX

Special MergeEditFormats used for particular Merge columns combination when some of the cells are empty.
Can be used to better specify what will be excluded from format instead of MergeType='4'.
The XXX are column names that are not empty for this row in the same order as in Merge.
For example for Merge='Path/Name.Ext' can be MergeEditFormatNameExt used when Path is empty.
new 6.4 <I cell> string

MergeEditFormatEmpty

MergeEditFormat use when all merged cells are empty.
new 6.4 API event void

OnMergeChanged

(TGrid grid, TRow row, string col, string val, string[] result)
Called after the cell with MergeFormat is edited. The val is the edited string, the result is default parsed val into array of cell values.
The order in result is the same as in MergeEditFormat.
Fill the result with new values if the value needs special parsing. Remember, the result has already filled its items.

For example, to parse file path in order Path, Name, Ext use such handler:
Grids.OnMergeChanged = function(G,row,col,val,res){
var idx = val.lastIndexOf("/");
if(idx>=0){ res[0] = val.slice(0,idx); val = val.slice(idx+1); } else res[0] = "";
var idx = val.lastIndexOf(".");
if(idx>=0) { res[1] = val.slice(0,idx); res[2] = val.slice(idx+1); } else { res[1] = val; res[2] = ""; }
}
chg 6.0 <I cell> string

MergeEdit

Used only without MergeFormat set. Specifies the one cell value that can be edited in merged cell. Only one value in merged cell can be edited without MergeFormat.
It is a column name. This column should be listed in Merge array.
The row with merged cell must have set Spanned='1', otherwise the attribute is ignored.
upd 6.4 <I cell> int

MergeType

[0]
Various flags for merging cells, bit array.
1. bit (&1) 0 - (only without MergeFormat) merged cells are displayed in one line (horizontally), 1 - merged cells are displayed in more lines (vertically)
2. bit (&2) 0 - if column is hidden, its cell value is removed too, 1 - all merged cell values are always visible regardless of column visibility. See FastMerge.
3. bit (&4) 1 - (only for MergeFormat) remove separated part after empty value (for the last column before empty value).
new 6.0 <Cfg> bool

FastMerge

[1]
If set to 1, ignores MergeType&2 (takes it as 1) for all cells when showing / hiding column.
It is faster, because the merged cells do not need to be refreshed.
<I> bool

SortSpan

[0]
Controls sorting in Spanned row.
By default, the grid sorts spanned rows always according to value in sorted column, even if this is invisible due spanning.
You can set values in these columns for spanned rows to support sorting in the way you want.
Or you can set SortSpan = '1' and row will be sorted always according to spanned column's value.
new 6.0 <I> string

LeftHtml

You can span the whole left column section and show here any HTML code.
All cell values in the section will be ignored.
new 6.0 chg 7.0 <I> string

MidHtml

You can span the whole variable column section and show here any HTML code.
All cell values in the section will be ignored.
(Version 7.0) For cell paging it is shown only on the first column page, on the next ones is shown MidHtml2.
new 7.0 <I> string

MidHtml2

For ColPaging the user section is spanned only through the one page, this value is shown on the second and next column pages in the middle section.
new 6.0 <I> string

RightHtml

You can span the whole right column section and show here any HTML code.
All cell values in the section will be ignored.
new 6.0 <Cfg> bool

SpannedTree

[0]
Set to 1 if some MainCol cell is spanned between columns (has set Span attribute).
If set to 1, it shows tree icons in included <table> tag and slows down rendering.
Cannot be used when the main column cells have set RowSpan.
renamed 9.2 <C> int

Block

[0]
Controls moving column, it is useful especially if there are some cells spanned to or from other columns.
If set to > 0, it is the block the column belongs to. Create blocks that contain the spanned cells. The blocks must be continuous.
The columns can be moved only inside its block and any other column cannot be moved into the block from outside.
The first (left) column in the block cannot be moved within the block and also must stay the first.
The whole block can be moved by dragging the first left column to another location.
It also preserves splitting block of columns to more pages when printing and for column paging.
Since 9.2 it was renamed from Group.

Vertical spanning among rows

IE8 strict mode has problems with rowSpan HTML attribute, so when using RowSpan switch IE8 to quirks mode (no !DOCTYPE) or to IE7 compatibility mode.
The functions problematic in IE8 strict mode and RowSpan: column with both RowSpan and Span - hide, show and move. Row with RowSpan - add, delete, move. Sort, filter and group are without problems.

In tree are all rows' children spanned according to its parent row. The last row's children are or are not included in range, according to the RowSpan is integer or not.
Cells are never spanned vertically among pages, the created page is always as high as to accommodate all spanned rows. In server paging you must ensure it by yourself.
Spanned rows are sorted and grouped together, their position within spanned range is always preserved.
It is possible to drag or add row into spanned range, the dropped row will get the span setting from the range.
It is possible to drag row outside spanned range, the dropped row will loose its row span and the cells become displayed.
It is possible to delete row from range, when deleted the first row (with RowSpan set), the range is split and the cells become visible, the row deleting will happen after uploading to server.
It is possible to drag whole spanned range by dragging the first row in range, when moved to another spanned range, the original spanned range is split.
It is possible to drag row inside the spanned range, only the first row (with RowSpan set) will stay always the first row in the range.
The row spanning was updated in version 7.0, in 6.x version it had various limitations and could broke layout in various cases.
new 6.0 <C> bool

Spanned

[0]
If the column contains any vertically spanned cells among rows (marked with RowSpan attribute).
Every column that contains some spanned cells among rows must have set Spanned="1", otherwise the cell RowSpan attribute will be ignored.
new 6.0 upd 7.0 <I cell> int

RowSpan

[0]
For vertically spanned cell among rows, how many cells it covers, at least one. Including hidden rows.
In tree it is a count of rows on the same level as this row. All their children are spanned automatically.
(New in 7.0) The last row's children are spanned within range when added 0.5 to the RowSpan, e.g. RowSpan='3.5' means span for three row and also the last row's children. The 0.5 cannot be used in ReversedTree.
The column with spanned cell must have set Spanned='1', otherwise the attribute is ignored.

Dynamic spanning

The cells in grid can be spanned dynamically by a user. He can select the cells by mouse dragging or shift/ctrl + click and click to Join button on toolbar. The spanned cells can be similarly split by selecting them and clicking to Split button on toolbar. The actions for spanning / splitting can be attached also to any other event like right/middle button click or popup menu item action.
The changes can be also uploaded to server, see Upload_Type="Span" and Upload_Flags="Spanned"
Only variable rows can be dynamically spanned.
new 7.0 upd 12.0 <Cfg> int

DynamicSpan

[0]
Set it to 1 to show icons for spanning on Toolbar and also prepare grid for spanning when no cell in grid is spanned on start.
When set to 1, it also saves changes in span and column moving to Undo.
Since 12.0 if set to 2, it also sets Spanned = 1 to all default rows and columns.
To permit selecting cells or cell ranges set <Cfg SelectingCells='1'/>.
By default cells can be selected by Ctrl + mouse drag. To swap the action with dragging rows, set <Actions OnDragCell="SelectCells" OnCtrlDragCell="DragRow"/>.
To clear selection on click set <Actions OnClickCell="ClearSelection,FocusEdit" OnClickOutside="ClearSelection,Blur"/>.
new 7.0 chg 12.0 <Actions>

SpanSelected ...F

Attached to OnClickButtonJoin event
Spans selected cells into one cell spanned horizontally and / or vertically.
If the selected cells are not in one rectangle, it creates more rectangles from the selection and spans one by one.
If there were already some cells spanned and interfered with the ranges, they are cut and split.
Fails if there is no selected cell. Since 12.0 version without ...F fails if the actual cell is not selected.
new 7.0 chg 12.0 <Actions>

SplitSelected ...F

Attached to OnClickButtonSplit event
Splits all spanned cells within selected range(s).
Fails if there is no selected cell. Since 12.0 version without ...F fails if the actual cell is not selected.
new 12.0 <Actions>

SpanCells ...F

Not attached to any event
Spans focused cell range into one cell spanned horizontally and / or vertically.
Fails if there is no focused range. Version without ...F fails if the actual cell is not focused.
new 12.0 <Actions>

SplitCells ...F

Not attached to any event
Splits all spanned cells within focused range.
Fails if there is no focused range. Version without ...F fails if the actual cell is not focused.
new 7.0 <Actions>

SplitCell ...F

Attached to OnClickButtonSplit event
Splits spanned actual or focused cell.
Fails if the cell is not spanned.
new 7.0 API method void

SpanRange

(TRow row1, string col1, TRow row2, string col2)
Spans the range into one cell with value from cell [row1,col1].
The [row1,col1] must be the upper left corner.
new 7.0 API method void

SplitSpanned

(TRow row, string col)
Splits the spanned cell. The row, col can be any cell within the rectangle to split.