Vaadin - 行修改后刷新网格

时间:2015-08-06 16:44:44

标签: java vaadin vaadin7 vaadin-grid

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

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

要编辑按钮的每一行:

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

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

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

5 个答案:

答案 0 :(得分:10)

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

grid.getDataProvider().refreshAll();

答案 1 :(得分:9)

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

grid.clearSortOrder();

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

可能重复Update Grid with a fresh set of data, in Vaadin 7.4 app

答案 2 :(得分:1)

自Vaadin 7.7.4以来,网格中有refreshRows(Object ... itemIds)refreshAllRows()方法:https://dev.vaadin.com/ticket/16765

答案 3 :(得分:0)

每次调用grid.setItems()事件后,我都必须显式调用 saveListener,以便在网格中生成我的Vaadin 8.3网格刷新数据。奇怪的是,视觉网格状态反映了已编辑的值。

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

答案 4 :(得分:0)

有一种更好地解决问题的方法:

您必须从容器中获取BeanItem,并将其传递到编辑器窗口。您可以在其中通过通过BeanItem的{​​{1}}来访问Bean本身。这是一项非常手工的工作,因此我总是使用Properies的databindg-只需调用FieldGroup(field,“ propertyName”);其中,propertyName是不带get和非大写字母的getter方法。