2015-07-10 2 views
1

Я работаю с редактируемой сеткой с Vaadin 7. Когда строка находится в режиме редактирования, она показывает две кнопки: сохранение и отмена.Добавить действие к кнопке отмены в редактируемой сетке в vaadin

enter image description here

(Только в случае, изображение было взято отсюда 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{} 
}); 

я могу сделать что-то в экономии действий. Но могу ли я сделать что-то подобное с действием отмены?

спасибо.

+1

Что именно вы хотите сделать? – tk12

+1

Нет, у FieldGroup нет события для отмены. Возможно, вы используете собственное расширение EditorFieldGroup и обрабатываете его там? –

+0

Я добавляю новую пустую строку, и если нажата кнопка отмены, я хочу ее удалить. – Luislode

ответ

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. Также обратите внимание, что вы расширяете серверную сторону, поэтому вам не нужно изменять клиент (код виджета), но вам нужно обратиться к новому компоненту в вашем дизайне интерфейса.

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 
    */ 
Смежные вопросы