Data Grid - Columns
This section goes in details on the aspects of the columns you need to know.
Column definitions
Grid columns are defined with the columns
prop.
columns
expects an array of objects.
The columns should have this type: GridColDef[]
.
field
is the only required property since it's the column identifier. It's also used to match with GridRowData
values.
interface GridColDef {
/**
* The column identifier. It's used to match with [[GridRowData]] values.
*/
field: string;
…
}
<DataGrid
columns={[{ field: 'id' }, { field: 'username' }, { field: 'age' }]}
rows={[
{
id: 1,
username: 'defunkt',
age: 38,
},
]}
/>
By default, columns are ordered according to the order they are included in the columns
array.
Column headers
You can configure the headers with:
headerName
: The title of the column rendered in the column header cell.description
: The description of the column rendered as tooltip if the column header name is not fully displayed.hide
: Hide the column.
<DataGrid
columns={[
{ field: 'id', hide: true },
{
field: 'username',
headerName: 'Username',
description:
'The identification used by the person with access to the online service.',
},
{ field: 'age', headerName: 'Age' },
]}
rows={rows}
/>
For more advanced header configuration, go to the rendering section.
Column width
By default, the columns have a width of 100 pixels.
This is an arbitrary, easy to remember value.
To change the width of a column, use the width
property available in GridColDef
.
<DataGrid
columns={[
{ field: 'id' },
{ field: 'username', width: 200 },
{ field: 'age' },
]}
rows={rows}
/>
Fluid width
Each column has a fixed width of 100 pixels by default, but column fluidity (responsiveness) can be by achieved by setting the flex
property in GridColDef
.
The flex
property accepts a value between 0 and ∞.
The flex
property works by dividing the remaining space in the grid among all flex columns in proportion to their flex
value.
For example, consider a grid with a total width of 500px that has three columns: the first with width: 200
; the second with flex: 1
; and third with flex: 0.5
.
The first column will be 200px wide, leaving 300px remaining. The column with flex: 1
is twice the size of flex: 0.5
, which means that final sizes will be: 200px, 200px, 100px.
Note that flex
doesn't work together with width
. If you set both flex
and width
in GridColDef
, flex
will override width
.
In addition, flex
does not work if the combined width of the columns that have width
is more than the width of the grid itself. If that is the case a scroll bar will be visible, and the columns that have flex
will default back to their base value of 100px.
Column resizing
By default, XGrid
allows all columns to be resized by dragging the right portion of the column separator.
To prevent the resizing of a column, set resizable: false
in the GridColDef
.
Alternatively, to disable all columns resize, set the prop disableColumnResize={true}
.
<XGrid
columns={[
{ field: 'id' },
{ field: 'username' },
{ field: 'age', resizable: false },
]}
rows={rows}
/>
Column types
To facilitate configuration of the columns, some column types are predefined. By default, columns are assumed to hold strings, so the default column string type will be applied. As a result, column sorting will use the string comparator, and the column content will be aligned to the left side of the cell.
The following are the native column types:
'string'
(default)'number'
'date'
'dateTime'
To apply a column type, you need to define the type property in your column definition.
<DataGrid
columns={[
{ field: 'name', type: 'string' },
{ field: 'age', type: 'number' },
{ field: 'dateCreated', type: 'date', width: 130 },
{ field: 'lastLogin', type: 'dateTime', width: 180 },
]}
rows={rows}
/>
Custom column types
You can extend the native column types with your own by simply spreading the necessary properties.
The demo below defines a new column type: usdPrice
that extends the native number
column type.
const usdPrice: GridColTypeDef = {
type: 'number',
width: 130,
valueFormatter: ({ value }) => valueFormatter.format(Number(value)),
cellClassName: 'font-tabular-nums',
};
<DataGrid
columns={[
{ field: 'status', width: 130 },
{ field: 'subTotal', ...usdPrice },
{ field: 'total', ...usdPrice },
]}
rows={rows}
/>
Column menu
By default, each column header displays a column menu. The column menu allows actions to be performed in the context of the target column, e.g. filtering. To disable the column menu, set the prop disableColumnMenu={true}
.
<DataGrid {...data} disableColumnMenu />
Column selector
To enable the the toolbar you need to add Toolbar: GridToolbar
to the grid components
prop.
In addition, the column selector can be shown by using the "Show columns" menu item in the column menu.
The user can choose which columns are visible using the column selector from the toolbar.
To disable the column selector, set the prop disableColumnSelector={true}
.
<DataGrid
{...data}
components={{
Toolbar: GridToolbar,
}}
/>
Column reorder
By default, XGrid
allows all column reordering by dragging the header cells and moving them left or right.
To disable column reordering, set the prop disableColumnReorder={true}
.
In addition, column reordering emits the following events that can be imported:
COL_REORDER_START
: emitted when dragging of a header cell starts.COL_REORDER_DRAG_ENTER
: emitted when the cursor enters another header cell while dragging.COL_REORDER_DRAG_OVER
: emitted when dragging a header cell over another header cell.COL_REORDER_DRAG_OVER_HEADER
: emitted when dragging a header cell over theColumnsHeader
component.COL_REORDER_STOP
: emitted when dragging of a header cell stops.
<XGrid {...data} />
🚧 Column groups
⚠️ This feature isn't implemented yet. It's coming.
👍 Upvote issue #195 if you want to see it land faster.
Grouping columns allows you to have multiple levels of columns in your header and the ability, if needed, to 'open and close' column groups to show and hide additional columns.
🚧 Column pinning
⚠️ This feature isn't implemented yet. It's coming.
👍 Upvote issue #193 if you want to see it land faster.
Sticky (or frozen, locked, or pinned) columns are columns that are visible at all times while the user scrolls the grid horizontally.
🚧 Column spanning
⚠️ This feature isn't implemented yet. It's coming.
👍 Upvote issue #192 if you want to see it land faster.
Each cell takes up the width of one column.
Column spanning allows to change this default behavior.
It allows cells to span multiple columns.
This is very close to the "column spanning" in an HTML <table>
.