行内编辑可以同时存在多个可编辑行吗?

我现在在一个DataGrid中,给备注设为可编辑单元格,有没有办法让多行的备注都处于编辑状态?
image

我看好像没有办法,Vaadin就支持一次编辑一行。你试试 双击编辑 是不是也可以,不用点 edit 那个按钮,再实现一个自动保存。这样编辑就很快了。

好的,我再试试

我现在改了一种实现方式,是将这两列都用组件渲染,我现在想,当问题确认这一列中 选择问题项的时候,备注里面的textField变成必填,但是选择正常项的时候,又是非必填的,请问这可以实现吗?
file_1726018836008_571

下面是我这两列的渲染器代码:

@Supply(to = "fplDataGrid.issueConfirm", subject = "renderer")
private Renderer<ReviewIssues> fplDataGridIssueConfirmRenderer() {
    return new ComponentRenderer<>(
            () -> {
                JmixRadioButtonGroup<String> jmixRadioButtonGroup = uiComponents.create(JmixRadioButtonGroup.class);
                jmixRadioButtonGroup.setItems("正常项", "问题项");
                jmixRadioButtonGroup.setWidth("135px");
                jmixRadioButtonGroup.setThemeName("Horizontal");
                return jmixRadioButtonGroup;
            },
            (jmixRadioButtonGroup, reviewIssues) -> {
                Boolean issueConfirm = reviewIssues.getIssueConfirm();
                if (issueConfirm != null) {
                    if (issueConfirm) {
                        jmixRadioButtonGroup.setValue("正常项");
                    } else {
                        jmixRadioButtonGroup.setValue("问题项");
                    }
                }
                jmixRadioButtonGroup.addValueChangeListener(e -> {
                    if (jmixRadioButtonGroup.getValue().equals("正常项")) {
                        reviewIssues.setIssueConfirm(true);
                    } else {
                        reviewIssues.setIssueConfirm(false);
                    }
                    dataManager.save(reviewIssues);
                    fplDl.load();
                });
            }
    );
}

@Supply(to = "fplDataGrid.remark", subject = "renderer")
private Renderer<ReviewIssues> fplDataGridRemarkRenderer() {
    return new ComponentRenderer<>(reviewIssues -> {
        TypedTextField<String> typedTextField1 = uiComponents.create(TypedTextField.class);
        typedTextField1.setWidth("100%");
        String remark = reviewIssues.getRemark();
        typedTextField1.setValue(remark == null ? "" : remark);
        typedTextField1.addValueChangeListener(e -> {
            reviewIssues.setRemark(typedTextField1.getValue());
            dataManager.save(reviewIssues);
            fplDl.load();
        });
        return typedTextField1;
    });
}

有一个思路:

  1. 在控制器中声明一个类变量 Map<UUID,TextField> 保存实体 id和 remark TextField的映射关系。
  2. 在remark的renderer中,把生成的 textField 保存在上面的map中。这里的textField可能需要添加NotEmpty 的 validator
  3. 在radioButtonGroup的事件中,如果满足条件,根据当前行的数据id,从 map 中获取 TextField并设置 required=true。
1 个赞

好的 我试一下,我现在又改成您说的非缓存的行内编辑了,等我测试效果不好的话,我在换成这个Map的形式