我正在使用带有Vaadin 7的可编辑网格。当一行处于编辑模式时,它会显示两个按钮:保存和取消。
(以防万一,图片来自这里Book of Vaadin)
使用:
grid.getEditorFieldGroup().addCommitHandler(new CommitHandler() {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
@Override
public void preCommit(CommitEvent commitEvent) throws CommitException{}
@Override
public void postCommit(CommitEvent commitEvent) throws CommitException{}
});
我可以在保存操作中执行某些操作。 但是,我可以通过取消操作做出类似的事情吗?
谢谢。
答案 0 :(得分:3)
这是该组件的严重缺陷。根据论坛,他们正在研究它,但目前似乎最直接的方法是扩展Grid组件并覆盖doCancelEditor方法。这是一个片段:
public class MyGrid extends Grid {
protected Object newRow;
@Override
protected void doCancelEditor() {
super.doCancelEditor();
getContainerDataSource().removeItem(newRow);
setEditorEnabled(false);
}
public void setNewRow(Object newRow) {
this.newRow = newRow;
}
请注意,在创建行时必须告诉MyGrid对象。此外,请注意您正在扩展服务器端,因此您不必更改客户端(窗口小部件代码),但您需要在UI设计中引用新组件。
答案 1 :(得分:0)
实际上,还应该重写saveEditor(),因为似乎也会在执行保存操作时调用doCancelEditor()。我的代码:
public class MyGrid extends Grid {
private boolean addingMode = false;
private JPAContainer<SomeEntity> container;
private Object recentlyAddedItemID;
public MyGrid(Indexed indexed) {
container = indexed;
}
@Override
protected void doCancelEditor() {
Object id = getEditedItemId();
super.doCancelEditor();
if (addingMode) {
getContainerDataSource().removeItem(id);
recentlyAddedItemID = null;
}
addingMode = false;
}
@Override
public void saveEditor() throws FieldGroup.CommitException {
if (addingMode) recentlyAddedItemID = getEditedItemId();
addingMode = false;
super.saveEditor();
}
public Object getRecentlyAddedItemID() {
return recentlyAddedItemID;
}
public void addNewElement(SomeEntity entity) {
addingMode = true;
editItem(container.addEntity(entity));
}
}
MyGrid grid = new MyGrid(JPAContainerFactory.make(SomeEntity.class, entityManager));
grid.addNewElement(new SomeEntity());
/*
if we want to know the new items's ID (actually the new primary key
in case of JPAContainer), we can check it by:
*/
Object id = grid.getRecentlyAddedItemID();
/*
returns null if editor was cancelled and finally nothing new was persisted
*/