Vaadin - 行修改后刷新网格

jso*_*ski 8 java vaadin vaadin7 vaadin-grid

我使用数据库中的数据创建简单网格:

BeanItemContainer<Customer> container = new BeanItemContainer<>(Customer.class, customerRepository.findAll());
Grid grid = new Grid(container);
Run Code Online (Sandbox Code Playgroud)

要编辑按钮的每一行:

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

这个打开的新窗口带有编辑表单.接受所有更改后,我必须手动刷新整个页面以查看Grid上的修改.我的问题是:

如何在修改任何行条目后仅刷新网格?如何将这些修改保存到数据库(也许beanItemContainer可以做到)?

小智 10

使用Vaadin 8,以下工作方式可以在添加或删除行或更改基础数据后刷新网格:

grid.getDataProvider().refreshAll();
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,这在Vaadin 8中不起作用.我每次都需要显式setItems. (3认同)
  • @Aubergine,如果您使用setItems()设置数据开始,那么是的,因为是的,这会创建一个包装项目列表的DataProvider,因此您需要显式更新项目。 (2认同)

kuk*_*kis 9

这是一个错误.在底层容器中进行更改后,Grid不会自行更新,也没有任何合理的刷新方法.围绕这个问题有几个黑客,即

grid.clearSortOrder();
Run Code Online (Sandbox Code Playgroud)

要么

grid.setEditorEnabled(true);
grid.setEditorEnabled(false);
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

在Vaadin 7.4应用程序中,可能重复更新网格,其中包含一组新数据