Reputation: 31
I know that the way of adding a Checkbox or TextField is by using renderCell and it works, I can see the Checkboxes:
However, I don't understand how I'm supposed to then control each row's Checkbox/TextField individually. Like, what if I want row 1 to have a "filled" variant of the TextField and row 2 to have an "outlined" variant.
import * as React from "react";
import {DataGrid} from "@mui/x-data-grid";
import {Box, Checkbox, TextField} from "@mui/material";
const columns = [
{field: "id", headerName: "ID", width: 30},
{field: "col1", headerName: "Column 1", width: 150},
{field: "col2", headerName: "Column 2", width: 150},
{field: "col3", headerName: "Column 3", width: 150, renderCell: (params) => <Checkbox />},
];
const rows = [
{id: 1, col1: "Example", col2: "Content", col3: ??????},
{id: 2, col1: "Example", col2: "Content", col3: ??????},
{id: 3, col1: "Example", col2: "Content", col3: ??????},
];
export default function Table() {
return (
<Box sx={{}}>
<DataGrid rows={rows} columns={columns} />
</Box>
);
}
I tried adding a new <Checkbox />
with props inside like <Checkbox defaultChecked/>
but of course, that doesn't work.
Upvotes: 1
Views: 5255
Reputation: 126
You can just set the original checkbox to be at other position.
import {GRID_CHECKBOX_SELECTION_COL_DEF} from '@mui/x-data-grid';
Then, set the checkbox columns in the order you wish, and add the checkbox column as part of the columns array
{...GRID_CHECKBOX_SELECTION_COL_DEF},
Example from MUI with the relevant adjustments:
import * as React from 'react';
import Box from '@mui/material/Box';
import { DataGrid, GridColDef, GRID_CHECKBOX_SELECTION_COL_DEF } from '@mui/x-data-grid';
const columns: GridColDef<(typeof rows)[number]>[] = [
{ field: 'id', headerName: 'ID', width: 90 },
{
field: 'firstName',
headerName: 'First name',
width: 150,
editable: true,
},
{
field: 'lastName',
headerName: 'Last name',
width: 150,
editable: true,
},
{
field: 'age',
headerName: 'Age',
type: 'number',
width: 110,
editable: true,
},
{
field: 'fullName',
headerName: 'Full name',
description: 'This column has a value getter and is not sortable.',
sortable: false,
width: 160,
valueGetter: (value, row) => `${row.firstName || ''} ${row.lastName || ''}`,
},
{...GRID_CHECKBOX_SELECTION_COL_DEF}
];
const rows = [
{ id: 1, lastName: 'Snow', firstName: 'Jon', age: 14 },
{ id: 2, lastName: 'Lannister', firstName: 'Cersei', age: 31 },
{ id: 3, lastName: 'Lannister', firstName: 'Jaime', age: 31 },
{ id: 4, lastName: 'Stark', firstName: 'Arya', age: 11 },
{ id: 5, lastName: 'Targaryen', firstName: 'Daenerys', age: null },
{ id: 6, lastName: 'Melisandre', firstName: null, age: 150 },
{ id: 7, lastName: 'Clifford', firstName: 'Ferrara', age: 44 },
{ id: 8, lastName: 'Frances', firstName: 'Rossini', age: 36 },
{ id: 9, lastName: 'Roxie', firstName: 'Harvey', age: 65 },
];
export default function DataGridDemo() {
return (
<Box sx={{ height: 400, width: '100%' }}>
<DataGrid
rows={rows}
columns={columns}
initialState={{
pagination: {
paginationModel: {
pageSize: 5,
},
},
}}
pageSizeOptions={[5]}
checkboxSelection
disableRowSelectionOnClick
/>
</Box>
);
}
Upvotes: 0
Reputation: 11
please take a look for my example for you. Hope I answer your question. https://codesandbox.io/s/optimistic-leaf-xm32lk?file=/Demo.tsx
import * as React from "react";
import { DataGrid, GridColDef, GridRenderCellParams } from "@mui/x-data-grid";
import Checkbox from "@mui/joy/Checkbox";
function RenderCheckBox(props: GridRenderCellParams<any, boolean>) {
const [checked, setChecked] = React.useState(props.value); // Initiated react binded value with param from `rows`
// Handler for user clicks to set checkbox mark or unset it
const handleChange = (event: React.ChangeEvent<HTMLInputElement>) => {
setChecked(event.target.checked);
};
//The bind for dynamic mark/unmark: checked={checked}
//The handler for user clicks: onChange={handleChange}
return (
<Checkbox
label="some text"
size="lg"
checked={checked}
onChange={handleChange}
/>
);
}
const columns: GridColDef[] = [
{ field: "id", headerName: "ID", width: 30 },
{ field: "col1", headerName: "Column 1", width: 150 },
{ field: "col2", headerName: "Column 2", width: 150 },
{
field: "checked",
headerName: "Column 3",
width: 150,
renderCell: RenderCheckBox
}
];
// Here 'checked' field will pass the param to component.
const rows = [
{ id: 1, col1: "Example", col2: "Content", checked: true },
{ id: 2, col1: "Example", col2: "Content", checked: false },
{ id: 3, col1: "Example", col2: "Content", checked: false }
];
export default function RenderCellGrid() {
return (
<div style={{ height: 300, width: "100%" }}>
<DataGrid rows={rows} columns={columns} />
</div>
);
}
Upvotes: 0