Search code examples
javavaadinvaadin7vaadin-grid

Vaadin - Refresh grid after row modification


I create simple grid with data from database:

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

To edit each row the button was created:

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

This open new window with edit form. After all changes accepted, I must manually refresh whole page to see modification on Grid. My question is:

How refresh only Grid after modification of any row entry? And how save those modifications to database (maybe beanItemContainer could do it)?


Solution

  • It's a bug. Grid doesn't update itself after changes were done in underlying container nor has any reasonable method to refresh. There are several hacks around this issue i.e.

    grid.clearSortOrder();
    

    or

    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();
    }
    

    Possible duplicate Update Grid with a fresh set of data, in Vaadin 7.4 app