2015-08-06 42 views
7

creo semplice griglia con i dati dal database:Vaadin - Griglia di aggiornamento dopo la modifica fila

BeanItemContainer<Customer> container = new BeanItemContainer<>(Customer.class, customerRepository.findAll()); 
Grid grid = new Grid(container); 

Per modificare ogni riga il pulsante è stato creato:

Button edit = new Button("Edit", clickEvent -> openWindow((Customer) grid.getSelectedRows().iterator().next())); 

Questa nuova finestra aperta con modulo di modifica. Dopo aver accettato tutte le modifiche, devo aggiornare manualmente tutta la pagina per vedere la modifica su Grid. La mia domanda è:

Come aggiornare solo la griglia dopo la modifica di qualsiasi voce di riga? E come salvare quelle modifiche al database (forse beanItemContainer potrebbe farlo)?

risposta

7

È un bug. La griglia non si aggiorna automaticamente dopo aver apportato modifiche nel contenitore sottostante né ha alcun metodo ragionevole per l'aggiornamento. Ci sono diversi hack per aggirare questo problema cioè

grid.clearSortOrder(); 

o

grid.setEditorEnabled(true); 
grid.setEditorEnabled(false); 

SSCCE:

TextField text = new TextField("Edit"); 
Grid grid; 
BeanItemContainer<Customer> container; 

@Override 
protected void init(VaadinRequest request) { 
    final VerticalLayout layout = new VerticalLayout(); 
    container = new BeanItemContainer<>(Customer.class, Arrays.asList(new Customer("1"), new Customer("2"))); 
    grid = new Grid(container); 
    Button open = new Button("open"); 
    open.addClickListener(this :: openListener); 
    Button save = new Button("save"); 
    save.addClickListener(this :: saveListener); 
    layout.addComponents(grid, open, save, text); 
    setContent(layout); 
} 

private void openListener(Button.ClickEvent clickEvent){ 
    text.setValue(((Customer) (grid.getSelectedRow())).getName()); 
} 
private void saveListener(Button.ClickEvent clickEvent){ 
    Customer c = (Customer) grid.getSelectedRow(); 
    c.setName(text.getValue()); 
    grid.clearSortOrder(); 
} 

Eventuali duplicati Update Grid with a fresh set of data, in Vaadin 7.4 app

+0

Grazie mille. Il tuo suggerimento con 'clearSortOrder()' funziona perfettamente. Inoltre per tutti coloro che desiderano aggiornare solo una riga, ci sono alcuni suggerimenti: [Forum Vaadin] (https://vaadin.com/forum/#!/thread/9319379/9334479) – jsosnowski

+0

Se si tratta di un bug, si hai il numero/link tracker Vaadin relativo? – Dominic

+0

https://github.com/vaadin/framework/issues/6542 – kukis

0

Dal Vaadin 7.7.4 c'è un refreshRows(Object ... itemIds) e un Metodo refreshAllRows() nella griglia: https://dev.vaadin.com/ticket/16765

+0

è questo metodo, ma non fa nulla (Vaadin 7.7.9) – FiruzzZ

+0

Funzionava quando ho postato questa risposta (quasi un anno fa). Se fossi in te, controllerei se i dati sono aggiornati nel container. – user1411778

7

Con Vaadin 8, i seguenti lavori per aggiornare la griglia dopo righe sono stati aggiunti o rimossi o dati sottostante è stata modificata:

grid.getDataProvider().refreshAll(); 
+3

Sfortunatamente questo non funziona in Vaadin 8. Devo impostare gli oggetti esplicitamente ogni volta. – Aubergine

+0

@Aubergine se si impostano i dati con setItems() per iniziare, quindi sì poiché crea un DataProvider che racchiude l'elenco di elementi e quindi è necessario aggiornare gli elementi in modo imprevisto. – sofend

+0

@Aubergine ma se si utilizza un DataProvider che recupera in modo dinamico i dati da un archivio dati (ad es. Un RDBMS), il metodo refreshAll() funziona come pubblicizzato. – sofend

0

ho dovuto chiamare esplicitamentegrid.setItems() dopo ogni chiamata a saveListener evento per rendere il mio Vaadin 8.3 Grid aggiornare i dati all'interno della griglia. È strano che lo stato della griglia visuale non sia non rifletta valori modificati.

implementazione Scala:

var advicesList : mutable.MutableList[Advice] = null 

private def initGrid() = { 
    advicesList = mutable.MutableList(itmemsFromDB: _*) 
    setItems(advicesList.asJava) 

    getEditor.addSaveListener((event) => { 
     val bean = event.getBean 
     Notification.show("Saved value: " + bean) 

     // ==== RELOAD GRID ITEMS AFTER EDITION 
     val oldItemIdx = advicesList.indexOf(advicesList.filter(a => a.id == bean.id).head) 
     advicesList.update(oldItemIdx, bean) 
     event.getGrid.setItems(advicesList.asJava) 
    }) 
} 
Problemi correlati