复选框上的多行选择和单击 MUI DataGrid 中的行时的单选

Posted

技术标签:

【中文标题】复选框上的多行选择和单击 MUI DataGrid 中的行时的单选【英文标题】:Multiple row selection on checkbox and single selection on clicking the row in MUI DataGrid 【发布时间】:2021-12-16 00:07:22 【问题描述】:

我正在使用MUI DataGrid version 4 组件。

我想要的是:

    从数据网格中的复选框启用多项选择(如果用户使用复选框选择多行) 禁用数据网格中行的多项选择(如果用户选择了多行) 启用从数据网格中的行进行单选(如果用户在选择一行后选择另一行)。

但我得到的是:

    复选框中的多项选择已启用(我想要什么) 已启用该行的多项选择(我不想要的)。

对于行选择,我只想要一个像这个答案MUI - Disable multiple row selection in DataGrid 这样的单一选择,但启用了复选框中的多个选择。

这是我的代码:https://codesandbox.io/s/material-ui-data-grid-selection-vq1ny

这是documentation for the selection on the Data Grid 组件。

注意:可以使用DataGridPro 组件。

如果问题不清楚,请告诉我。

【问题讨论】:

2.和 3. 是一回事吗? 是的,你是对的 【参考方案1】:

您可以控制selectionModel 状态并检查用户是否单击了单元格(而不是复选框)。如果他们点击复选框,onCellClick 将不会被触发,如果他们点击其他单元格,onCellClick 将被触发,然后根据该信息相应地更新selectionModel

const cellClickRef = React.useRef(null);
const [selectionModel, setSelectionModel] = React.useState([]);

return (
  <div style= height: 400, width: '100%' >
    <DataGrid
      checkboxSelection
      selectionModel=selectionModel
      onCellClick=() => (cellClickRef.current = true)
      onSelectionModelChange=(selection, detail) => 
        if (cellClickRef.current) 
          if (selection.length > 1) 
            const selectionSet = new Set(selectionModel);
            const result = selection.filter((s) => !selectionSet.has(s));

            setSelectionModel(result);
           else 
            setSelectionModel(selection);
          
         else 
          setSelectionModel(selection);
        
        cellClickRef.current = null;
      
      ...data
    />
  </div>
);

相关答案

MUI - Disable multiple row selection in DataGrid

【讨论】:

哇很好的解释和答案。我什至不考虑onCellClick 道具。我想知道你为什么使用cellClickRef.current = true 而不是setCellClickRef(cellClickRef.current) @JabalLogian 我使用useRef 而不是useState 来防止额外的重新渲染。每次调用 setState 时,组件都会再次呈现,在这种情况下这是不必要的。当您单击一个单元格以选择一行时,无论组件是否呈现,都会调用onCellClick 然后onSelectionModelChange 回调

以上是关于复选框上的多行选择和单击 MUI DataGrid 中的行时的单选的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IEditableObject 对象在 WPF DataGrid 中执行单击复选框选择

easyui datagrid 怎么去除单击行选中事件

c# wpf datagrid中选择所有复选框的代码

easyui的datagrid如何去除复选框

Datatable vuetify 选择多行(Shift+单击)

在 WPF 中使用 Datagrid 的多选复选框