Vaadin - 行修改后刷新网格
Vaadin - Refresh grid after row modification
我使用数据库中的数据创建了简单的网格:
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()));
这将打开新的 window 编辑表单。接受所有更改后,我必须手动刷新整个页面才能看到网格上的修改。我的问题是:
如何在修改任何行条目后仅刷新网格?
以及如何将这些修改保存到数据库(也许 beanItemContainer 可以做到)?
这是一个错误。在底层容器中完成更改后,网格不会自行更新,也没有任何合理的刷新方法。围绕这个问题有几个技巧,即
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
从 Vaadin 7.7.4 开始,网格中有一个 refreshRows(Object ... itemIds)
和一个 refreshAllRows()
方法:https://dev.vaadin.com/ticket/16765
使用 Vaadin 8,在添加或删除行或更改基础数据后,以下工作用于刷新网格:
grid.getDataProvider().refreshAll();
我必须在每次调用 saveListener
事件后 显式调用 grid.setItems()
以使我的 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)
})
}
有一种方法可以更好地解决问题:
您必须从容器中获取 BeanItem
并将其传递给您的编辑器 window。在那里,您可以通过 BeanItem
s Properies
访问它来更改 bean 本身。这是一项非常手工的工作,所以我总是使用 FieldGroup
的数据绑定 - 只需调用 bind
(field, "propertyName");其中 propertyName 是没有 get 和非大写字母的 getter 方法。
我使用数据库中的数据创建了简单的网格:
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()));
这将打开新的 window 编辑表单。接受所有更改后,我必须手动刷新整个页面才能看到网格上的修改。我的问题是:
如何在修改任何行条目后仅刷新网格? 以及如何将这些修改保存到数据库(也许 beanItemContainer 可以做到)?
这是一个错误。在底层容器中完成更改后,网格不会自行更新,也没有任何合理的刷新方法。围绕这个问题有几个技巧,即
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
从 Vaadin 7.7.4 开始,网格中有一个 refreshRows(Object ... itemIds)
和一个 refreshAllRows()
方法:https://dev.vaadin.com/ticket/16765
使用 Vaadin 8,在添加或删除行或更改基础数据后,以下工作用于刷新网格:
grid.getDataProvider().refreshAll();
我必须在每次调用 saveListener
事件后 显式调用 grid.setItems()
以使我的 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)
})
}
有一种方法可以更好地解决问题:
您必须从容器中获取 BeanItem
并将其传递给您的编辑器 window。在那里,您可以通过 BeanItem
s Properies
访问它来更改 bean 本身。这是一项非常手工的工作,所以我总是使用 FieldGroup
的数据绑定 - 只需调用 bind
(field, "propertyName");其中 propertyName 是没有 get 和非大写字母的 getter 方法。