Data Grid - Column pinning
Pin columns to keep them visible at all time.
Pinned (or frozen, locked, or sticky) columns are columns that are visible at all time while the user scrolls the data grid horizontally. They can be pinned either to the left or right side and cannot be reordered.
To pin a column, there are a few ways:
- Using the
initialState
prop - Controlling the
pinnedColumns
andonPinnedColumnsChange
props - Dedicated buttons in the column menu
- Accessing the imperative API
Initializing the pinned columns
To set pinned columns via initialState
, pass an object with the following shape to this prop:
interface GridPinnedColumns {
left?: string[]; // Optional field names to pin to the left
right?: string[]; // Optional field names to pin to the right
}
The following demos illustrates how this approach works:
Controlling the pinned columns
While the initialState
prop only works for setting pinned columns during the initialization, the pinnedColumns
prop allows you to modify which columns are pinned at any time.
The value passed to it follows the same shape from the previous approach.
Use it together with onPinnedColumnsChange
to know when a column is pinned or unpinned.
Disable column pinning
For all columns
Column pinning is enabled by default, but you can easily disable this feature by setting the disableColumnPinning
prop.
<DataGridPro disableColumnPinning />
For some columns
To disable the pinning of a single column, set the pinnable
property in GridColDef
to false
.
<DataGridPro columns={[{ field: 'id', pinnable: false }]} /> // Default is `true`.
Pin non-pinnable columns programmatically
It may be desirable to allow one or more columns to be pinned or unpinned programmatically that cannot be pinned or unpinned on the UI (i.e. columns for which prop disableColumnPinning = true
or colDef.pinnable = false
).
This can be done in one of the following ways.
- (A) Initializing the pinned columns
- (B) Controlling the pinned columns
- (C) Using the API method
setPinnedColumns
to set the pinned columns
// (A) Initializing the pinning
<DataGridPro
disableColumnPinning
initialState={{ pinnedColumns: { left: ['name'] } }}
/>
// (B) Controlling the pinned columns
<DataGridPro
disableColumnPinning
pinnedColumns={{ left: ['name'] }}
/>
// (C) Using the API method `setPinnedColumns` to set the pinned columns
<React.Fragment>
<DataGridPro disableColumnPinning />
<Button onClick={() => apiRef.current.setPinnedColumns({ left: ['name'] })}>
Pin name column
</Button>
</React.Fragment>
The following demo uses method (A) to initialize the state of the pinned columns which pins a column name
although the pinning feature is disabled.
Pinning the checkbox selection column
To pin the checkbox column added when using checkboxSelection
, add GRID_CHECKBOX_SELECTION_COL_DEF.field
to the list of pinned columns.
Usage with dynamic row height
You can have both pinned columns and dynamic row height enabled at the same time.
However, if the rows change their content after the initial calculation, you may need to trigger a manual recalculation to avoid incorrect measurements.
You can do this by calling apiRef.current.resetRowHeights()
every time that the content changes.
The demo below contains an example of both features enabled:
apiRef
The grid exposes a set of methods that enables all of these features using the imperative apiRef
. To know more about how to use it, check the API Object section.
Signature:
getPinnedColumns: () => GridPinnedColumnFields
Signature:
isColumnPinned: (field: string) => GridPinnedColumnPosition | false
Signature:
pinColumn: (field: string, side: GridPinnedColumnPosition) => void
Signature:
setPinnedColumns: (pinnedColumns: GridPinnedColumnFields) => void