Skip to content

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;
  columns={[{ field: 'id' }, { field: 'username' }, { field: 'age' }]}
      id: 1,
      username: 'defunkt',
      age: 38,

By default, columns are ordered according to the order they are included in the columns array.

⚠️ The columns prop should keep the same reference between two renders. The columns are designed to be definitions, to never change once the component is mounted. Otherwise, you take the risk of losing the column width state (if resized). You can create the array outside of the render function or memoize it.

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.
    { field: 'id', hide: true },
      field: 'username',
      headerName: 'Username',
        'The identification used by the person with access to the online service.',
    { field: 'age', headerName: 'Age' },

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.

    { field: 'id' },
    { field: 'username', width: 200 },
    { field: 'age' },

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}.

    { field: 'id' },
    { field: 'username' },
    { field: 'age', resizable: false },

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.

    { field: 'name', type: 'string' },
    { field: 'age', type: 'number' },
    { field: 'dateCreated', type: 'date', width: 130 },
    { field: 'lastLogin', type: 'dateTime', width: 180 },

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',
    { field: 'status', width: 130 },
    { field: 'subTotal', ...usdPrice },
    { field: 'total', ...usdPrice },

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 {} 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}.

    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:

  • columnReordering:dragStart: emitted when dragging of a header cell starts.
  • columnReordering:dragEnter: emitted when the cursor enters another header cell while dragging.
  • columnReordering:dragOver: emitted when dragging a header cell over another header cell.
  • columnReordering:dragOverHeader: emitted when dragging a header cell over the ColumnsHeader component.
  • columnReordering:dragEnd: emitted when dragging of a header cell stops.
<XGrid {} />

🚧 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>.