Skip to content

Data Grid - Master detail

Expand your rows to display additional information.

The master detail feature allows expanding a row to display additional information inside a panel. To use this feature, pass a function to the getDetailPanelContent prop with the content to be rendered inside the panel. Any valid React element can be used as the row detail, even another grid.

By default, the detail panel height is 500px. You can customize it by passing a function to the getDetailPanelHeight prop. This function must return either a number or the "auto" string. If it returns a number, then the panel will use that value (in pixels) for the height. If it returns "auto", then the height will be derived from the content.

<DataGridPro
  getDetailPanelContent={({ row }) => <div>Row ID: {row.id}</div>}
  getDetailPanelHeight={({ row }) => 100} // Optional, default is 500px.
/>

// or

<DataGridPro
  getDetailPanelContent={({ row }) => <div>Row ID: {row.id}</div>}
  getDetailPanelHeight={({ row }) => 'auto'} // Height based on the content.
/>

To expand a row, click on the + icon or press Space inside the detail toggle column. Returning null or undefined as the value of getDetailPanelContent will prevent the respective row from being expanded.

Order ID
Customer
Placed at
Currency
Total
1
Matheus
3/4/2025
CHF
239.138
2
Olivier
5/22/2024
EUR
1,530.354
3
Flavien
9/30/2024
BRL
190.68
4
Danail
10/4/2024
AUD
847.539
5
Alexandre
8/11/2024
CAD
774.175
Total Rows: 5

Infer height from the content

Like dynamic row height, you can also derive the detail panel height from its content. For this, pass a function to the getDetailPanelHeight prop returning "auto", as below:

<DataGridPro getDetailPanelHeight={() => 'auto'} />

The following example demonstrates this option in action:

Order ID
Customer
Placed at
Currency
Total
1
Matheus
6/3/2024
BRL
1,745.121
2
Olivier
10/24/2024
NZD
2,935.905
3
Flavien
2/16/2025
AUD
1,814.925
4
Danail
1/7/2025
NZD
727.23
5
Alexandre
10/14/2024
AUD
297.885
Total Rows: 5

Controlling expanded detail panels

To control which rows are expanded, pass a list of row IDs to the detailPanelExpandedRowIds prop. Passing a callback to the onDetailPanelExpandedRowIds prop can be used to detect when a row gets expanded or collapsed.

On the other hand, if you only want to initialize the data grid with some rows already expanded, use the initialState prop as follows:

<DataGridPro initialState={{ detailPanel: { expandedRowIds: [1, 2, 3] } }}>
Order ID
Customer
Placed at
Currency
Total
1
Matheus
12/28/2024
THB
878.88
2
Olivier
12/9/2024
HKD
425.73
3
Flavien
4/2/2025
BRL
574.23
4
Danail
12/8/2024
AUD
391.32
5
Alexandre
10/3/2024
THB
336.81
Total Rows: 5

Using a detail panel as a form

As an alternative to the built-in row editing, a form component can be rendered inside the detail panel, allowing the user to edit the current row values.

The following demo shows integration with react-hook-form, but other form libraries are also supported.

Order ID
Customer
Email
1
Matheus
ofume@vek.sx
2
Olivier
testiz@luzizi.ke
3
Flavien
sesocsu@cib.fi
4
Danail
kuw@zujo.ws
5
Alexandre
zudokatij@oc.se
Total Rows: 5

Customizing the detail panel toggle

To change the icon used for the toggle, you can provide a different component for the icon slot as follow:

<DataGridPro
  slots={{
    detailPanelExpandIcon: CustomExpandIcon,
    detailPanelCollapseIcon: CustomCollapseIcon,
  }}
/>

If this is not sufficient, the entire toggle component can be overridden. To fully customize it, add another column with field: GRID_DETAIL_PANEL_TOGGLE_FIELD to your set of columns. The grid will detect that there is already a toggle column defined and it will not add another toggle in the default position. The new toggle component can be provided via renderCell in the same as any other column. By only setting the field, is up to you to configure the remaining options (e.g. disable the column menu, filtering, sorting). To already start with a few suggested options configured, spread GRID_DETAIL_PANEL_TOGGLE_COL_DEF when defining the column.

<DataGridPro
  columns={[
    {
      field: GRID_DETAIL_PANEL_TOGGLE_FIELD,
      renderCell: (params) => <CustomDetailPanelToggle {...params} />
    },
  ]}
/>

// or

<DataGridPro
  columns={[
    {
      ...GRID_DETAIL_PANEL_TOGGLE_COL_DEF, // Already contains the right field
      renderCell: (params) => <CustomDetailPanelToggle {...params}>
    },
  ]}
/>

This approach can also be used to change the location of the toggle column, as shown below.

Order ID
Customer
Placed at
Currency
Total
1
Matheus
1/10/2025
HKD
190.29
2
Olivier
10/10/2024
JPY
855.52
3
Flavien
12/28/2024
ARS
377.46
4
Danail
6/29/2024
AUD
545.34
5
Alexandre
2/8/2025
HKD
819.54
Total Rows: 5

Disable detail panel content scroll

By default, the detail panel has a width that is the sum of the widths of all columns. This means that when a horizontal scrollbar is present, scrolling it will also scroll the panel content. To avoid this behavior, set the size of the detail panel to the outer size of the data grid. Use apiRef.current.getRootDimensions() to get the latest dimension values. Finally, to prevent the panel from scrolling, set position: sticky and left: 0.

The following demo shows how this can be achieved. Notice that the toggle column is pinned to make sure that it will always be visible when the data grid is scrolled horizontally.

Order ID
Customer
Email
Placed at
Currency
Address
City
Total
1
Matheus
mun@sep.gg
5/16/2024
EUR
1919 Ubuma Extension
Ehijtu, Uzbekistan
367.962
2
Olivier
bez@mozcifsah.hm
10/31/2024
EUR
784 Sedka Center
Agevula, New Caledonia
93.02
3
Flavien
hebed@ufgifit.edu
11/11/2024
CHF
969 Wedom Circle
Sonilso, Iran, Islamic Republic of
2,381.684
4
Danail
dup@katrub.hn
12/28/2024
CAD
1794 Cuvol Mill
Erebomek, United Kingdom
1,644.962
5
Alexandre
eclapjap@epezin.st
2/18/2025
CHF
444 Gewga Mill
Ribulo, Benin
3,763.2
6
José
pug@hidpoheco.nr
12/2/2024
BRL
296 Wakke Way
Tuvitapa, US Virgin Islands
228.732
Total Rows: 6

Recipes

More examples of how to customize the detail panel:

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:
getExpandedDetailPanels: () => GridRowId[]
Signature:
setExpandedDetailPanels: (ids: GridRowId[]) => void
Signature:
toggleDetailPanel: (id: GridRowId) => void