1

我正在使用带有 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{}
});

我可以在保存操作中做一些事情。但是,我可以用取消操作做类似的事情吗?

谢谢你。

4

2 回答 2

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 设计中引用新组件。

于 2015-11-03T21:16:11.987 回答
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
    */
于 2015-12-29T23:46:35.100 回答