Vaadin-无法在组合框值更改时更新网格容器

时间:2017-10-11 09:54:10

标签: combobox grid containers vaadin selection

我正在使用vaadin 7.7.7

在网格中,我有一个组合框作为其中一列中的编辑项目 如

if(!DB::query('SELECT username FROM users WHERE username=:username', array(':username'=>$username))){
    //create user
    DB::query('INSERT INTO users VALUES (null, :username, :password, :email)', array(':username'=>$username, ':password'=>password_hash($password, PASSWORD_BCRYPT), ':email'=>$email));
    echo "SUCCESS!";
} else {
    echo 'USER ALREADY EXIST';
}

我需要根据组合框选择更改

更新同一行中的属性/单元格

我的问题是,选择更改事件会触发两次,一次是单击组合框,另一次是选择值更改时。但是下一个单元格中的更新值仅在第一次在UI上反映出来。 下面是编写的代码。任何解决方案?

grid.addColumn("columnProperty").setEditorField(combobox);

需要更新编辑模式下组合框更改的单位栏(保存前)

请参阅以下图片链接

example image

1 个答案:

答案 0 :(得分:0)

即使字段获得应向用户显示的值,您也会获得值更改事件。为了获得指示用户已接受输入的事件,您应使用字段组(setEditorFieldGroup)。

来自Vaadin的书example for grid editing

grid.getColumn("name").setEditorField(nameEditor);

FieldGroup fieldGroup = new FieldGroup();
grid.setEditorFieldGroup(fieldGroup);
fieldGroup.addCommitHandler(new CommitHandler() {
    private static final long serialVersionUID = -8378742499490422335L;

    @Override
    public void preCommit(CommitEvent commitEvent)
           throws CommitException {
    }

    @Override
    public void postCommit(CommitEvent commitEvent)
           throws CommitException {
        Notification.show("Saved successfully");
    }
});

修改

我假设您要连接参数和单位组合框。我会用这种价值变化列表来做到这一点

BeanItemContainer container = new BeanItemContainer<>(
        Measurement.class,
        measurements);
Grid grid = new Grid(container);
grid.setEditorEnabled(true);
ComboBox parameterComboBox = new ComboBox();
ComboBox unitComboBox = new ComboBox();
parameterComboBox.addItems(Parameter.Pressure, Parameter.Temperature, Parameter.Time);
parameterComboBox.addValueChangeListener(v -> setUnits(parameterComboBox, unitComboBox));
grid.getColumn("parameter").setEditorField(parameterComboBox);
grid.getColumn("unit").setEditorField(unitComboBox);

单位可以像这样更新。我认为如果你替换组合框中的可用项目,你需要保留当前值并将其设置回来。

private void setUnits(ComboBox parameterComboBox, ComboBox unitComboBox) {
    Object currentValue = unitComboBox.getValue();
    List<String> units = unitsForParameter(parameterComboBox.getValue());
    unitComboBox.removeAllItems();
    unitComboBox.addItems(units);
    if (units.contains(currentValue)) {
        unitComboBox.setValue(currentValue);
    } else {
        unitComboBox.setValue(null);
    }
}

private List<String> unitsForParameter(Object value) {
    if (value == null) {
        return Collections.emptyList();
    } else if (value == Parameter.Pressure) {
        return asList("Pascal", "Bar");
    } else if (value == Parameter.Temperature) {
        return asList("Celcius", "Kelvin");
    } else if (value == Parameter.Time) {
        return asList("Second", "Minute");
    } else {
        throw new IllegalArgumentException("Unhandled value: " + value);
    }
}