News in versions: FastGrid 1.0, TreeGrid 17.0
FastGrid FastSheet ExamplesSamples DocumentationDoc Download Licensing Prices Buy Development
services
References References Contacts
TreeGrid Gantt chart SpreadSheet ExamplesSamples DocumentationDoc Download Licensing Prices Buy Contacts
FastGrid documentation
Search in documentation
FastGrid versions compatibility

Changes log (txt file) Compare FastGrid 1.0 & TreeGrid 17.1

Using in JavaScript frameworks

Angular Ember Express React Svelte Vue Other frameworks NodeJS server SalesForce LWC

Data and creating FastGrid

Simple examples of creating FastGrid Create FastGrid Display grid Access grid by API Sheets, more grids switched in one place Layout and configuration Data rows, columns, toolbars, images Changes in data rows, columns, toolbars Saving changes to server Mark changes Loading children on expand parent Short format

Layout - grid parts

Parts - ColParts and RowParts Part size Part scroll position Sets Column sets Row sets

Toolbars

Toolbar Cells Icon Height Width Toolbar position Dragging and manipulating cells Special toolbars

Rows and columns
Default rows, columns, cells, toolbars
Row and column identity

Row / column id Row / column index Row / column name

Row and column manipulation

API to get grid objects Auto added columns & rows on scroll Blocks of rows / columns Adding / copying / moving Deleting Showing and hiding Layout menu Selecting rows and columns Fill cell values by dragging Locking grid against changes Undo & redo

Row and column tree

Row and column tree Row tree Column tree Expand & collapse

Cells
Cell values and attributes

Read and write any values by API Cell value Cell attributes Cell value & attributes in UTF8 Store

Editing cells

Editing During editing Validation and errors

Cell images

Row cell side icons Icons definition Mark icons and charts Mark icons list Row cell floating images

Cell size

Row height Column width Resizing rows and columns Padding Margin Cell span

Cell style

Grid style and look Cell style permissions Cell style Cell outer border Cell inner border Alternate row & column background

Other cell features

Cell hyperlink Cell tooltip Static cells Other cell attributes Row & column attributes to speed up

Cell types and formats
Cell type and format Range - more values / ranges in cell String type Html type Auto type
Bool type

Bool type Check side icon Bool type & Check side icon

Number type

Format Localization

Date type

Format Localization Calendar

Calculations - formulas
JavaScript formulas

JavaScript formulas Aggregate functions String aggregate functions Other functions

Editable formulas

Formula rules Formula attributes Defined names for editable formulas Conditional functions Lookup functions Cell reference functions Logical functions Informational functions Mathematical functions Trigonometry functions Rounding numbers Number conversions String functions Date functions Summary functions

Dialogs and menus

Dialog Dialog Place Dialog API Menu definition in Script Cell menu List Suggest

Features
Sorting rows / columns

Sorting Sorting settings Comparing strings

Grouping rows / columns

Grouping Grouping settings Comparing strings Pivot grid

Filtering rows and columns

Filtering Filter settings Comparing strings

Search in cells Import files to grid
Export files

Export files Export and copy to clipboard CSV data

Copy & paste via system clipboard

Copy & paste Copy to clipboard Paste from clipboard

Printing

Print Print to PDF

Global grid settings
Grid size & scroll

Grid size Grid scrollbars Paging and view Media rules - responsive design

Saving settings in storage or cookies
Focus and hover cells

Focus cell and cell ranges Mouse hover cells Highlight cells, rows and columns

Events

Mouse events Key events API events

Language

Translation Languages

Messages

Message Message style

Other API

API for iterating rows and columns Paint and repaint Various API methods

Debug & files

Debugging FastGrid files

UTF8 Store - fast & short data
Introduction - License & download

Basic description Main advantages Basic usage License Download Documentation

Script language implementations

JavaScript C# JAVA PHP

Suggested ucodes

Bits - small integers or enums Integers or enums with strings Date and time Floating point numbers Special strings

Basic ucodes

Integer 1 char String 1 char Date 1 char Bits 1 char Integer 2 chars String 2 chars Date 2 chars Float 2 chars Integer 3 chars String 3 chars Date 3 chars Integer and double float 5 chars String 5 chars Date 5 chars Fixed length string Separated strings Adjacent strings Prefix for escaping string Fixed length data Unused custom codes Prefix for stored separator or length Prefix for stored base number Unused basic ucodes

Complex ucodes

chars signed decimals multiple limits varstrings escape base chars2 signed2 decimals2 multiple2 limits2

Internal coding Profiling times for ucode options Function reference

FastGrid layout

FastGrid documentation

FastGrid layout is split to horizontal and vertical Parts.
Horizontal parts named as ColParts define columns and vertical scrollbars.
Vertical parts names RowParts define rows, toolbars and horizontal scrollbars.
Both rows and columns can be sorted, grouped, searched and manipulated in the same way.
Cell values and attributes are defined only in RowParts, in rows and toolbars.

Parts - ColParts and RowParts

Grid Part[]

ColParts

[...]
Array of horizontal parts in grid. Every part in the array is object with at least id attribute defined.
The individual parts define columns and vertical scrollbar.
Default ColParts content is defined in Defaults.js as:
ColParts:[
    { id:"LeftScroll",Type:"Scroll", Item:"$ItemLeftScroll", Hidden:1 },
    { id:"LeftCols", Type:"Cols", Rel:100000, MinWidth:70, MinWidthResize:21, ExportFixed:1 },
    { id:"FCols", Sealed:0 }, only in Sheet
    { id:"Cols", Type:"Cols", Rel:2, MinWidth:70, MaxAuto:475254, AcceptImages:1 },
    { id:"RightCols",Type:"Cols", Rel:100000, MinWidth:70, MinWidthResize:21 },
    { id:"RightScroll",Type:"Scroll", Item:"$ItemRightScroll" }
    ]

The most of grids don't need to redefine the ColParts, the default definition with three column parts (the middle one maximized) and right vertical scrollbar is often suitable.
The input data can contain more ColParts definitions. The later ColParts definition changes attributes of previously defined parts (by id) and adds new parts to the end.
The ColParts definition can contain first item as { Clear:1 } to clear all previously define col parts.
For example: ColParts:[ {id:"Cols",Rel:0}, {id:"Cols2",Type:"Cols",Rel:1} ] redefines the Cols part with Rel:0 and defines next part Cols2.
Grid Part[]

RowParts

[...]
Array of vertical parts in grid. Every part in the array is object with at least id attribute defined.
The individual parts define rows, toolbars, column tree and horizontal scrollbar.
Default RowParts content is defined in Defaults.js as:
RowParts:[
    { id:"Top", Type:"Toolbars" },
    { id:"TopScroll", Type:"Scroll", Item:"$ItemTopScroll", Hidden:1 },
    { id:"Tree", Type:"Tree", Add:1, Item:"$ItemColTree" },
    { id:"Head", Type:"Rows", ExportFixed:1, Highlight:0, Rel:100000, MinHeight:70, MinHeightResize:0 },
    { id:"FBody", Sealed:0 }, only in Sheet
    { id:"Body", Type:"Rows", Rel:2, MinHeight:70, MinHeightResize:0, Sealed:0, Group:"", NoData:"$NoData", MaxAuto:3000000, AcceptImages:1 },
    { id:"Foot", Type:"Rows", Rel:100000, MinHeight:70, MinHeightResize:0 },
    { id:"BottomScroll", Type:"Scroll", Item:"$ItemBottomScroll" },
    { id:"Bottom", Type:"Toolbars" }
    ]

The most of grids don't need to redefine the RowParts, the default definition with three row parts (the middle one maximized), top and bottom toolbar, top column tree and bottom horizontal scrollbar is often suitable.
The input data can contain more RowParts definitions. The later RowParts definition changes attributes of previously defined parts (by id) and adds new parts to the end.
The RowParts definition can contain first item as { Clear:1 } to clear all previously define col parts.
For example: RowParts:[ {id:"Body",NoData:""}, {id:"NextRows",Type:"Rows",Rel:1} ] redefines the Body part with NoData:"" and defines next part NextRows.
Part string

id

GetPartAttr
Unique identification of the part. It must be unique among all RowParts and ColParts.
Under this tag name can be defined content of the part (rows, column, toolbars).
The id must not contain dollar "$" and underscore character "_".
Part string

Type

["Cols" / "Rows"] GetPartAttr
Specifies base type of the part and its content. It can be:
Cols - columns part, defines one or more columns. Can be horizontally scrolled.
Rows - rows part, defines one or more rows. Can be vertically scrolled.
Toolbars - toolbars part, defines one or more toolbars.
Tree - column tree part, special part to show tree to expand / collapse columns.
Scroll - scrollbar part, shows vertical scrollbar if defined in ColTree or horizontal scrollbar if defined in RowTree.
Empty - empty part without any content. It can contain Width or Height attribute to specify its size.
Default value is "Cols" if defined in ColParts and "Rows" if defined in RowParts.
RowPart string

NoData

["" / "$NoData"] GetPartAttr SetPartAttr
Text shown if the row part does not have any visible rows.
Default is "$NoData" for Body part and empty for all other row parts.
Part string

NextPart

GetPartAttr
Next part in for iteration. All parts in chain PrevPart / NextPart chain are iterated together. These parts permits e.g. focus rect between the parts.
The chain parts with PrevPart / NextPart must not be closed loop, there must be always the first and the last part in the chain!
Part string

PrevPart

GetPartAttr
Previous part in for iteration. All parts in chain PrevPart / NextPart chain are iterated together. These parts permits e.g. focus rect between the parts.
The chain parts with PrevPart / NextPart must not be closed loop, there must be always the first and the last part in the chain!
Part bool

Sealed

[1/0]
If set and the part (rows/columns/toolbars) has no content on start, it is removed.
By default it set 1 to all defined parts except Body.
Part string

Next

Places the part before the part with given id.
Use it to move the part to different position than the order in the RowParts or ColParts.
The Next part must be already defined and correctly placed.
For example: RowParts:[{id:"Top",Next:"Body"}] moves the Top part before the Body part.
Part string

Prev

Places the part after the part with given id.
Use it to move the part to different position than the order in the RowParts or ColParts.
The Prev part must be already defined and correctly placed.
For example: RowParts:[{id:"Top",Prev:"Body"}] moves the Top part after the Body part.
Part bool

Clear

If set, removes all previously defined parts of the same type (row parts or column parts).
Part string

ScrollColor

GetPartAttr SetPartAttr
Background color of the assigned horizontal (for col part) or vertical (for row part) scrollbar. To color not used scrollbar usually by "header" color.
Part string

BorderColor

GetPartAttr SetPartAttr
Border color for outer border of the part. It can be one color as color for all edges or four comma separated values for top, right, bottom, left edge colors; if one edge is missing, no color change is done, e.g. ",header,,#FF00FF"
It is read from column part before row part.
Part string

BorderColor{Part id}

GetPartAttr
Border color for outer border of the part set. The {Part id} can be row part id if set in column part or column part id if set in row part id.
It is read from column part before row part. If set, it is preferred to BorderColor.
If is ignored for bottom line in horizontal scrollbar and for all borders in toolbars part or empty horizontal part.
Part any

PrintBorderColor

GetPartAttr SetPartAttr
Border color for outer border of the part used when printed, preferred to BorderColor.
Part any

PrintBorderColor{Part id}

GetPartAttr
Border color for outer border of the part set used when printed, preferred to BorderColor{Part id}.
Grid Item[]

{Part id}

Definition of one ColPart / RowPart, base set. It can contain array of rows, columns or toolbars.
The tag name is the Part id.
By default there are three column sections: LeftCols, Cols, RightCols,
three row sections: Head, Body, Foot
and two toolbar sections Top, Bottom.
It is possible to redefine the parts in ColParts and RowParts.
The Part array can contain items specified by its Type.

It is possible to define the Part in more tags with different suffix "_xxx" and / or in more input files, the Part content arrays are merged in order they are defined.
It is also possible to define the Part tag as object with attributes, to set the Part attributes instead of its content.
For example:
Body: [ {id:1}, {id:2} ], ...
Body_attrs: { Height:100, MinHeight:50 }, ...
Body_new: [ {id:3}, {id:4}, {id:5} ]
Cfg string

DefRowPart

["Body"] GetCfgAttr
Default row part id. The row part must exist. Used when some row has not specified the part it belongs to.
Cfg string

DefColPart

["Cols"] GetCfgAttr
Default column part id. The column part must exist. Used when some column has not specified the part it belongs to.
Grid method any

GetPartAttr

(string part, string attr, string set = null)
It is faster but less universal and safe than Get.
Returns value of attribute attr of given Part part (id of the Part).
Returns null for error - for not existing part, attr or set.
If set set (id of the Set), returns attribute of given Set in the Part.
Grid method bool

SetPartAttr

(string part, string attr, any value, string set = null)
It is faster but less universal and safe than Set.
Sets value of attribute attr of given Part part (id of the Part) to value.
Returns true if the attribute was changed and Paint() is required or false if the attribute had the value already.
Returns null for error - for not existing part, attr or set.
If set set (id of the Set), sets attribute of given Set in the Part.
Grid method string

AddPart

(object / string part, string / int next = 0)
Adds or moves given part before the next part.
part can be an object to create and add new part. The part object should have set at least id and Type.
part can be a string to move existing part or add new part with the id = part and Type = "Rows" or "Cols".
next can be also 0 to add to end of RowParts or 1 to add to end of ColParts.
Returns id of the added or moved part.
Grid method void

RemovePart

(string part)
Removes the part and all its rows / column / toolbars.
Grid method void

HidePart

(object / string part, bool hide = null)
Hides / shows given row or column part. hide = 0 - shows, 1 - hides, null - changes the visibility. Initial visibility of the scrollbar can be set by the part Hiden attribute.
It does the change immediately, but for parts except scrollbars it does need Paint.

Part size

Part number

Rel

[0/1] GetPartAttr
If set, resizes / shrinks the part width (ColParts) or height (RowParts) to fill the whole grid width / height.
If more parts have set Rel attribute, their widths/heights are resized according their Rel ratio (except Rel values 1 and -1).
If the part contains columns / rows with attribute Rel set, the part width/height change resizes also the columns / row.
If set Rel value negative, it is taken as positive, but the part cannot be resized beyond its content even if it contains columns / rows with attribute Rel. In this case the Rel columns/rows are used only to fill Fix>0 and MinWidth / Width / MinHeight / Height.
If Rel > 1 or Rel <- 1 or Rel = 1 and part contains some column/row with Rel set, the base ratio is 0 and if main tag has not set width/height, the part is resized to 0!
To use Rel values as ratio to resize more parts the main tag must have set width/height and no Rel have value 1 or -1.
Default is 1 in Body and Cols parts and 0 in other parts.
Part int

Fix

[0] GetPartAttr SetPartAttr
If the part width (ColParts) or height (RowParts) can be higher than the part content.
It will add empty space to the rest or resizes columns / rows with Rel attribute.
0 - no
Part size is between 0 - Width / Height (or MaxWidth / MaxHeight or unlimited) according to the part content.
Part resize by Rel is between MinWidth / MinHeight (or 0) - Width / Height (or MaxWidth / MaxHeight or unlimited).
1 - fix MinWidth / MinHeight
Part size is between MinWidth / MinHeight (or 0) - Width / Height (or MaxWidth / MaxHeight or unlimited) according to the part content.
Part resize by Rel is between MinWidth / MinHeight (or 0) - Width / Height (or MaxWidth / MaxHeight or unlimited).
2 - fix Width / Height
Part size is always Width / Height regardless on the part content (or like 1 if not defined Width / Height). Also for resize by Rel.
Part bool

Hidden

[0] GetPartAttr HidePart
If set to 1, the part is not displayed. It can be set also to scrollbar part (Type="Scroll").
Part bool

NoResize

[0] GetPartAttr SetPartAttr
If the part width / height can be resized by mouse dragging scroll bar edge.
ColPart int

Width

GetPartAttr SetPartWidth
Width of col Part in pixels. Its usage depends on part Fix and Rel values.
It can be changed by users when resizing the part (by dragging part edge in horizontal scrollbar).
Grid method void

SetPartWidth

(string part, int width, bool max = 0)
Sets given width to the part Width. If set max, sets MaxWidth instead of Width.
Grid method int

GetPartWidth

(string part)
Returns actual width of the part without its border in pixels. Similar to clientWidth.
Grid method int

GetPartScrollWidth

(string part)
Returns actual width of the part content in pixels. Similar to scrollWidth.
If the part has no horizontal scrollbar, it is equal to GetPartWidth return.
ColPart int

MinWidth

[70] GetPartAttr SetPartAttr
Minimal width of col Part in pixels. Its usage depends on part Fix and Rel values.
ColPart int

MinWidthResize

[0/21] GetPartAttr SetPartAttr
Minimal width of col Part in pixels for resizing by mouse dragging. It is used instead of MinWidth.
To ignore it and use MinWidth, set it to null or to -1.
ColPart int

MaxWidth

GetPartAttr SetPartAttr
Maximal width of col Part in pixels. Its usage depends on part Fix and Rel values.
ColPart int

MaxWidthResize

GetPartAttr SetPartAttr
Maximal width of col Part in pixels for resizing by mouse dragging. It is used instead of MaxWidth.
If set to 1, it permits resizing the col part without limit.
If set to >1, it permits resizing the col part to this limit in pixels.
If set to -1, it permits resizing the col part without limit and changes the part MaxWidth instead of Width.
If set to <-1, it permits resizing the col part to this limit as positive in pixels and changes the part MaxWidth instead of Width.
Negative value is expected to use with max width of the grid tag set by Cfg MaxWidth.
ColPart int

RelColsWidth

GetPartAttr SetPartAttr
Minimal width of all Rel columns in the part.
RowPart int

Height

GetPartAttr SetPartHeight
Height of row Part in pixels. Its usage depends on part Fix and Rel values.
It can be changed by users when resizing the part (by dragging part edge in vertical scrollbar).
Grid method void

SetPartHeight

(string part, int height, bool max = 0)
Sets given height to the part Height. If set max, sets MaxHeight instead of Height.
Grid method int

GetPartHeight

(string part)
Returns actual height of the part without its border in pixels. Similar to clientHeight.
Grid method int

GetPartScrollHeight

(string part)
Returns actual height of the part content in pixels. Similar to scrollHeight.
If the part has no vertical scrollbar, it is equal to GetPartHeight return.
RowPart int

MinHeight

[70] GetPartAttr SetPartAttr
Minimal height of row Part in pixels. Its usage depends on part Fix and Rel values.
RowPart int

MinHeightResize

[0] GetPartAttr SetPartAttr
Minimal height of row Part in pixels for resizing by mouse dragging. It is used instead of MinHeight.
To ignore it and use MinHeight, set it to null or to -1.
RowPart int

MaxHeight

GetPartAttr SetPartAttr
Maximal height of row Part in pixels. Its usage depends on part Fix and Rel values.
RowPart int

MaxHeightResize

GetPartAttr SetPartAttr
Maximal height of row Part in pixels for resizing by mouse dragging. It is used instead of MaxHeight.
If set to 1, it permits resizing the row part without limit.
If set to >1, it permits resizing the row part to this limit in pixels.
If set to -1, it permits resizing the row part without limit and changes the part MaxHeight instead of Height.
If set to <-1, it permits resizing the row part to this limit as positive in pixels and changes the part MaxHeight instead of Height.
Negative value is expected to use with max height of the grid tag set by Cfg MaxHeight.
Cfg bool

ResizingRowParts

[1] GetCfgAttr
If row parts can be resized by dragging their bottom edge in the vertical scrollbar area.
Cfg bool

ResizingColParts

[1] GetCfgAttr
If column parts can be resized by dragging their right edge in the horizontal scrollbar area.
Cfg int

ResizePartEdge

[6] GetCfgAttr SetCfgAttr
Width on horizontal scrollbar and height on vertical scrollbar of the part resize area.
The resize area is placed on both edges of every scrollbar and dragging this area resizes the part (Height and Width attributes).
RowPart string[]

OverlayParts

It can be set to comma separated string or array of column part ids.
Cells in the listed parts can overlay the cell in the next column part (if listed too).
Only cells containing HTML tags in value (and with Type="Html" or Type="Auto" plus AutoHtml = 1) or cells with set attribute Static / TextFont / TextSize / TextStyle / Align>=16 will be affected.
Note, all the cells that can overlay to the next column part also overlay all the next cells in the same column part.
The border between the column parts can be removed by setting BorderColor. Border between cells inside part can be removed by ColBorder.
Use for parts containing only special rows like Sticky usually with Static cells.

Part scroll position

ColPart int

ScrollLeft

GetScrollLeft SetScrollLeft
Horizontal scroll position in column part in pixels on start.
ColPart string

ScrollLeftCol

GetScrollLeft SetScrollLeft
Column id to scroll to this column on start. The column will be the first left column in the view.
Grid method int

GetScrollLeft

(string part)
Returns horizontal scroll position in given column part.
Grid method int

SetScrollLeft

(string part, int scroll)
Sets horizontal scroll position in given column part.
RowPart int

ScrollTop

GetScrollTop SetScrollTop
Vertical scroll position in row part in pixels on start.
RowPart int

ScrollTopRow

GetScrollTop SetScrollTop
Row id to scroll to this row on start. The row will be the first top row in the view.
Grid method int

GetScrollTop

(string part)
Returns vertical scroll position in given row part.
Grid method int

SetScrollTop

(string part, int scroll)
Sets vertical scroll position in given row part.
Cfg bits

IgnoreScroll

[0] / [2] GetCfgAttr SetCfgAttr
&1 - If set, ignores ScrollTop, ScrollTopRow, ScrollLeft, ScrollLeftCol attributes on start. Ignores also scroll settings in xlsx.
&2 - If set, does not scroll to focused cell on start.
! Cfg bool

HideVScroll

[0] GetCfgAttr SetCfgAttr
If set, hides vertical scrollbar(s), if not needed. It can slow down paint after row manipulation.
Cfg bool

HideHScroll

[1] GetCfgAttr SetCfgAttr
If set, hides horizontal scrollbar(s), if not needed.
Part any

ScrollOnDrag

GetPartAttr SetPartAttr
What will be scrolled when mouse drags above the part. Scrolls vertically for row part and horizontally for column part.
It is array or comma separated string with these items: [bound1,scroll1,scrollpart1,bound2,scroll2,scrollpart2,bound3,...]
If set to empty string or array, it disables the scroll on drag for this part.

boundX - the scrollX is applied if mouse is between 0 and boundX on actual actual row / column part. Positive value of boundX is taken from left / top, negative value is taken from right / bottom.
The array is tested from start and the first suitable boundX is used and its scrollX is applied, the next items are ignored.
scrollX specifies how much will be scrolled, positive value scrolls down, negative value scrolls up.
scrollpartX is id of the part to scroll, if empty or omitted, it scrolls actual part.

If the boundX or scrollX value is >1, it is value in pixels.
If the boundX or scrollX value is <=1, it is taken as ratio of the part width / height.
If the boundX or scrollX value is ends by "%" (e.g. "50%"), it is used as percentage of default column width / row height.

For example "15,100%,30,3,-15,-100%,-30,-3", for range 0-15 scrolls the same part by one row/column, for range 15-30 scrolls by 3 pixels.
For example "0.5,100%,Body,1,1,Body", for range 0-50% scrolls Body by one row down, for range 50% - 100% scrolls Body by one page.

Cfg any

ScrollRowsOnDrag

["30,-3,-30,3"] GetCfgAttr SetCfgAttr
If and how will be scrolled parts vertically when dragging their top and bottom edge. Format the same as ScrollOnDrag.
Cfg any

ScrollColsOnDrag

["30,-5,-30,5"] GetCfgAttr SetCfgAttr
If and how will be scrolled parts horizontally when dragging their left and right edge. Format the same as ScrollOnDrag.
! RowPart int / string

StickyRow

GetPartAttr SetPartAttr
If set, shows in the appropriate row cell the values of parent(s) of the first row displayed in the part view. Similar behavior to CSS position: sticky.
It is id of any row or toolbar in grid.
The row cell, where to display the information from parents is set by StickyCol or if not set and it is row and not toolbar, uses StickyTree or Tree. This cell should have set Static = 1 to speed up its update!
Note that the static cells can also overlay to the next column part cells if set OverlayParts.
This row is automatically hidden, if the part has not set Tree.
For more complex sticky behavior use event OnScroll (optionally with OnGrouped) instead of the StickyRow attribute.
RowPart int / string

StickyCol

GetPartAttr SetPartAttr
Column or toolbar cell where to display the values in StickyRow.
It must be set for toolbar. If not set for normal row, the StickyTree or Tree is used.
RowPart int / string

StickyTree

GetPartAttr SetPartAttr
Column from which are read the parent values. The parent values are joined by $StickySeparator text.
If not set, Tree is used.
Cfg int

ScrollWheel

[2] GetCfgAttr SetCfgAttr
What movement is done on scrolling by mouse wheel (vertical).
0 - no scroll, 1 - scroll only in chosen direction, 2 - if not possible to scroll vertically, scrolls horizontally, 3 - like 1, but never scrolls page or grid parent when no scrolling in grid is available.
Cfg bits

OverScroll

[0] GetCfgAttr SetCfgAttr
If set and scrollable part scrolled by touch cannot be scrolled more or at all in given direction, it permits scrolling its scrollable parent tag or body. &1 - horizontally, &2 - vertically.
Cfg int

FixedScroll

[1] GetCfgAttr SetCfgAttr
Fix scroll change to whole rows or block heights. Used only if scrolled by scrollbars or by mouse wheel.
It also sets number of rows to fix scroll to, e.g. 2 fixes to every the second row, useful for Alternate.
Cfg bits

FixedScrollType

[2] / [1] GetCfgAttr SetCfgAttr
Options for FixedScroll.
1+2. bit &3 - 0 - no fixed scroll, 1 - fixed large scroll, 2 - fixed large and wheel scroll, 3 - fixed all scroll.
3. bit &4 - Rounds scroll position to the whole rows - the grid will always display the whole row on top its row part.
Cfg int

FixedScrollLarge

[30] GetCfgAttr SetCfgAttr
How many pixels should be scrolled for large scroll, used by FixedScrollType.
API event Row

OnFixedScroll

(Grid grid, Row row, int change)
Called on scroll if FixedScroll is applied.
Use to fix scroll only to specific row, to fix the scroll to block of rows. The block should be enough narrow, only a few rows, to not break the scrolling! Return the row or different row to fix the scroll position on it.
change is the scroll change in pixels, negative up, positive down.
API event Row

OnScroll

(Grid grid, string rowpart, int top, int oldtop, string colpart, int leftp, int oldleft)
Called after any scroll position in grid changed.
rowpart is affected row part, the top is its actual scroll position and oldtop is previous scroll position.
colpart is affected column part, the left is its actual scroll position and oldleft is previous scroll position.
Usually is scroll in one direction only, so top equals to oldtop or left equals to oldleft.

Sets

Every grid has one base RowSet (set of rows) and one base ColSet (set of columns).
The rows / columns and attributes in base sets are defined directly in the Part.
The most of grids don't use other row and column sets, they have only the two base sets.
The rows / columns and attributes for the other sets are defined in PartSet named as Part_id+"$"+Set_id.
Grid Item[]

{Part id}${Set id}

Definition of one ColPart / RowPart, specified set. It can contain array of rows or columns.
The tag name is the Part id + '$' + setid.
The setid must be unique among all row and col sets in grid. The setid is defined just by using it in this definition. The setid must not contain underscore character "_".
The specified ColSet is used for rows with attribute S="setid".
The specified RowSet is used for ColPart with attribute S="setid".

It is possible to define the PartSet in more tags with different suffix "_xxx" and / or in more input files, the PartSet content arrays are merged in order they are defined.
It is also possible to define the PartSet tag as object with attributes, to set the Part attributes instead of its content.
For example:
Body$Set2: [ {id:1}, {id:2} ], ...
Body$Set2_attrs: { Tree:"B" }, ...
Body$Set2_new: [ {id:3}, {id:4}, {id:5} ]
Grid method string

GetSet

(Row row) or (string part)
It is faster but less universal and safe than Get.
Returns id of ColSet assigned to the row or RowSet assigned to the ColPart part. Use Parts[id] to get particular ColPart.
For base set returns empty string.
Returns null if called with different object than row or part.
Grid method bool

SetSet

(Row row, string set = "") or (string part, string set = "")
It is faster but less universal and safe than Set.
Assigns given set id as ColSet to the row or RowSet to the ColPart part.
If set is not set, assigns base Set.
Returns true for success, false for incorrect set and null if called with different object than row or part.

ColSet

Every row can show specified ColSet in its ColParts. All ColParts in the row always show the same ColSet.
ColSets can be used to display rows with different columns and their width in one grid.
ColSets can be used to display nested grids with different layout in parent grid.
If the specified ColSet does not have definition for some ColPart, it displays columns from the base ColSet.
If row in some ColSet have smaller width than the widest row, empty space is shown in the rest.
Example with three ColSets:
FGrid.Data = {
LeftCols: [ { id:"L" } ],
LeftCols$Set2: [ { id:"L2", Width:120 } ],
Cols: [ { id:"M",Width:90 }, { id:"N",Width:90 }, { id:"O",Width:90 } ],
Cols$Set2: [ { id:"M2", Width:150 }, { id:"N2", Width:120 } ],
Cols$Set3: [ { id:"M3",Width:120 }, { id:"N3", Width:150 } ],
RightCols$Set3: [ { id:"R3" } ],
Head: [ 
   { id:"H1", Kind:"Header", V: { L:"H1-L", L2:"H1-L2", M:"H1-M", M2:"H1-M2", M3:"H1-M3", N:"H1-N", N2:"H1-N2", N3:"H1-N3", O:"H1-O", R3:"H1-R3"} },
   { id:"H2", Kind:"Header", V: { L:"H1-Set2-L", L2:"H1-Set2-L2", M:"H1-Set2-M", M2:"H1-Set2-M2", M3:"H1-Set2-M3", N:"H1-Set2-N", N2:"H1-Set2-N2", N3:"H1-Set2-N3", O:"H1-Set2-O", R2:"H1-Set2-R2" }, S:"Set2" }
   ],
Body: [ 
   { id:"B1", V: { L:"B1-L", L2:"B1-L2", M:"B1-M", M2:"B1-M2", M3:"B1-M3", N:"B1-N", N2:"B1-N2", N3:"B1-N3", O:"B1-O", R3:"B1-R3" } }, 
   { id:"B2", V: { L:"B2-L", L2:"B2-L2", M:"B2-M", M2:"B2-M2", M3:"B2-M3", N:"B2-N", N2:"B2-N2", N3:"B2-N3", O:"B2-O", R3:"B2-R3" } }, 
   { id:"B1-Set2", V: { L:"B1-Set2-L", L2:"B1-Set2-L2", M:"B1-Set2-M", M2:"B1-Set2-M2", M3:"B1-Set2-M3", N:"B1-Set2-N", N2:"B1-Set2-N2", N3:"B1-Set2-N3", O:"B1-Set2-O", R3:"B1-Set2-R3" }, S:"Set2" },
   { id:"B1-Set3", V: { L:"B1-Set3-L", L2:"B1-Set3-L2", M:"B1-Set3-M", M2:"B1-Set3-M2", M3:"B1-Set3-M3", N:"B1-Set3-N", N2:"B1-Set3-N2", N3:"B1-Set3-N3", O:"B1-Set3-O", R3:"B1-Set3-R3" }, S:"Set3" },
   ],
Foot: [ { id:"F1-Set3", V: { L:"F1-Set3-L", L2:"F1-Set3-L2", M:"F1-Set3-M", M2:"F1-Set3-M2", M3:"F1-Set3-M3", N:"F1-Set3-N", N2:"F1-Set3-N2", N3:"F1-Set3-N3", O:"F1-Set3-O", R3:"F1-Set3-R3"}, S:"Set3" } ]
};
Row string / int

S

GetSet SetSet
ColSet id displayed in this row. The columns for the ColSet are defined in {Part id}${Set id}
RowPart string / int

S

GetSet SetSet
Only for RowPart Type="Tree".
ColSet id its tree is displayed in this row part. The columns for the ColSet are defined in {Part id}${Set id}

RowSet

Every ColPart can show specified RowSet in its RowParts. All RowParts in the ColPart always show the same RowSet.
If the specified RowSet does not have definition for some RowPart, it displays rows from the base RowSet.
If ColPart in some RowSet have smaller height than the highest ColPart, empty space is shown in the rest.
Example with three RowSets:
FGrid.Data = {
   ColParts: [ { id:"LeftCols", S:"Set2" }, { id:"RightCols", S:"Set3" } ],
   LeftCols: [ { id:"L" } ],
   Cols: [ { id:"M" }, { id:"N" } ],
   RightCols: [ { id:"R" } ],
   Head: [ { id:"H1", Kind:"Header", V: { L:"H1-L", M:"H1-M", N:"H1-N", R:"H1-R"} } ],
   Head$Set2: [ { id:"H1-Set2", V: { L:"H1-Set2-L", M:"H1-Set2-M", N:"H1-Set2-N", R:"H1-Set2-R" } } ],
   Body: [ { id:"B1", V: { L:"B1-L", M:"B1-M", N:"B1-N", R:"B1-R" } }, { id:"B2", V: { L:"B2-L", M:"B2-M", N:"B2-N", R:"R2-R" } }, { id:"B3", V: { L:"B3-L", M:"B3-M", N:"B3-N", R:"R3-R" } } ],
   Body$Set2: [ { id:"B1-Set2", V: { L:"B1-Set2-L", M:"B1-Set2-M", N:"B1-Set2-N", R:"B1-Set2-R" } } ],
   Body$Set3: [ { id:"B1-Set3", V: { L:"B1-Set3-L", M:"B1-Set3-M", N:"B1-Set3-N", R:"B1-Set3-R"} } ],
   Foot$Set3: [ { id:"F1-Set3", V: { L:"F1-Set3-L", M:"F1-Set3-M", N:"F1-Set3-N", R:"F1-Set3-R"} } ]
   };
ColPart string / int

S

GetSet SetSet
RowSet id displayed in this ColPart. The rows for the RowSet are defined in {Part id}${Set id}