Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
Refresh grid data after update using form
Hello,
I am trying to achieve something and i spent few hours before coming with the solution.
There is a grid list of item which I need to show few columns only and when user selects an item ( Grid.SingleSelection), i show a form with all the columns from that particular row.
The user then updates the row with the values and when save is clicked, i need to update the grid as well. To update the grid, i was doing.
// Adds the updated item to the end of the list and it is
// not what i want.
// container.removeItem(originalBean);
// container.addItem(updated);
The above solution works but it only updates the grid at the end of the list.
Then i read, discussions: https://vaadin.com/forum/#!/thread/408555/408554 & https://vaadin.com/forum#!/thread/9319379 .
i realized that i had to get the property of the Grid to make it work.
Then i did:
// Does what i want but just wondering if there is any other
// solution.. better
Item item = grid.getContainerDataSource().getItem(originalBean);
item.getItemProperty("age").setValue(updated.getAge());
item.getItemProperty("firstName").setValue(updated.getFirstName());
item.getItemProperty("lastName").setValue(updated.getLastName());
It works like a charm..!!
My only concern now is there another better way of doing this, without getting the Properties and updating the values manually. [ no idea but as suggested in above discussion call: fireStateChanged?? couldn't get my head wrapped around that..]
Could someone please advice and guide me on how to do it better. In the mean while i can deal with this okay solution.
Below is my sample code.. of what i was trying::
public class TestingForms extends CssLayout {
private static final long serialVersionUID = -7255586307801066971L;
private List<Person> persons = new ArrayList<>();
private Grid grid = new Grid();
private BeanFieldGroup<Person> personBeanFieldGroup = new BeanFieldGroup<>(Person.class);
private FormLayout personForm = new FormLayout();
private TextField firstName = new TextField("First Name: ");
private TextField lastName = new TextField("Last Name: ");
private TextField age = new TextField("Age: ");
private Container.Indexed container;
private Person originalBean = null;
public TestingForms() {
populatePersons();
container = new BeanItemContainer<>(Person.class, persons);
createGridComponent();
addEvents();
populateFormLayout();
}
private void populateFormLayout() {
personForm.addComponent(firstName);
personForm.addComponent(lastName);
personForm.addComponent(age);
Button button = new Button("Save");
button.addClickListener(new ClickListener() {
private static final long serialVersionUID = -1621003547230015891L;
@Override
public void buttonClick(ClickEvent event) {
try {
personBeanFieldGroup.commit();
Person updated = personBeanFieldGroup.getItemDataSource().getBean();
// Adds the updated item to the end of the list and it is
// not what i want.
// container.removeItem(originalBean);
// container.addItem(updated);
// Does what i want but just wondering if there is any other
// solution.. better
Item item = grid.getContainerDataSource().getItem(originalBean);
item.getItemProperty("age").setValue(updated.getAge());
item.getItemProperty("firstName").setValue(updated.getFirstName());
item.getItemProperty("lastName").setValue(updated.getLastName());
} catch (CommitException e) {
e.printStackTrace();
}
}
});
personForm.addComponent(button);
Button clearButton = new Button("Clear");
clearButton.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event) {
personBeanFieldGroup.clear();
}
});
personForm.addComponent(clearButton);
}
private void addEvents() {
grid.addSelectionListener(new SelectionListener() {
private static final long serialVersionUID = -7936930180846481298L;
@Override
public void select(SelectionEvent event) {
Set<Object> selected = event.getSelected();
addComponent(personForm);
for (Iterator<Object> iterator = selected.iterator(); iterator.hasNext();) {
originalBean = (Person) iterator.next();
personBeanFieldGroup.bind(firstName, "firstName");
personBeanFieldGroup.bind(lastName, "lastName");
personBeanFieldGroup.bind(age, "age");
personBeanFieldGroup.setItemDataSource(originalBean);
}
}
});
}
private void populatePersons() {
for (int i = 0; i < 100; i++) {
Person person = new Person();
person.setAge(i);
person.setFirstName("firstName " + i);
person.setLastName("lastName " + i);
persons.add(person);
}
}
private void createGridComponent() {
grid.setImmediate(true);
grid.setContainerDataSource(container);
grid.setColumnOrder("age", "firstName", "lastName");
grid.getColumn("age").setHeaderCaption("Age");
grid.getColumn("firstName").setHeaderCaption("First name");
grid.getColumn("lastName").setHeaderCaption("Last name");
grid.setSelectionMode(SelectionMode.SINGLE);
this.addComponent(grid);
}
}