Vaadin Flow 23.1.7:Grid全选忽略过滤问题求解决方案
Vaadin Grid过滤后全选仅选中可见行的解决方法
针对你遇到的Vaadin 23.1.7中Grid过滤后全选会选中所有隐藏行的问题,以下是两种可行的解决方法:
方法一:自定义表头全选复选框行为
直接替换默认的全选逻辑,让它只选中当前过滤后的可见项:
// 获取表头的全选复选框组件 Checkbox selectAllCheckbox = (Checkbox) grid.getHeaderRow(0).getCell(grid.getColumns().get(0)).getComponent(); selectAllCheckbox.addClickListener(event -> { event.preventDefault(); // 禁用默认全选行为 GridListDataView<YourItemType> dataView = grid.getListDataView(); boolean targetState = !selectAllCheckbox.isChecked(); if (targetState) { // 收集当前过滤后的所有可见项并选中 List<YourItemType> visibleItems = dataView.getItems().collect(Collectors.toList()); grid.select(visibleItems); } else { grid.deselectAll(); } // 同步复选框状态 selectAllCheckbox.setValue(targetState); });
注意将YourItemType替换为你Grid中实际的实体类型。
方法二:通过选择事件修正选中范围
监听Grid的选择事件,当检测到触发了全选操作时,自动修正为仅选中过滤后的可见项:
grid.addSelectionListener(event -> { if (event.isFromClient() && event.getAllSelectedItems().size() == grid.getListDataView().getItems().count()) { // 判定为触发了默认全选,重新设置选中范围 GridListDataView<YourItemType> dataView = grid.getListDataView(); List<YourItemType> visibleItems = dataView.getItems().collect(Collectors.toList()); // 先清空所有选中,再选中可见项 grid.deselectAll(); grid.select(visibleItems); } });
额外建议
优先考虑升级到Vaadin 23.2及以上版本,该回归问题在后续版本中已被修复,升级后无需额外代码即可解决问题。
内容的提问来源于stack exchange,提问作者Franz
相关产品推荐
相关产品推荐

