9

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

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 可以做到)?

4

5 回答 5

11

使用 Vaadin 8,在添加或删除行或更改基础数据后刷新网格:

grid.getDataProvider().refreshAll();
于 2017-04-04T15:00:47.643 回答
10

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

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

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

于 2015-08-07T07:31:48.117 回答
1

由于 Vaadin 7.7.4在网格中有一个refreshRows(Object ... itemIds)和一个方法: https ://dev.vaadin.com/ticket/16765refreshAllRows()

于 2016-11-24T09:00:18.910 回答
0

我必须在每次调用事件后显式调用 ,以使我的 Vaadin 8.3 Grid 刷新网格内的数据。奇怪的是,视觉网格状态不反映编辑值。grid.setItems()saveListener

斯卡拉实现:

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)
  })
}
于 2018-01-23T12:54:04.833 回答
0

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

您必须BeanItem从容器中获取并将其传递给您的编辑器窗口。BeanItem在那里,您可以通过s访问 bean 来更改 bean 本身Properies。这是一项非常手动的工作,所以我总是使用 databindg of FieldGroup- just call bind(field, "propertyName"); 其中 propertyName 是没有 get 和非大写字母的 getter 方法。

于 2018-11-11T14:29:26.227 回答