Je crée une grille simple avec des données de base de données:
BeanItemContainer<Customer> container = new BeanItemContainer<>(Customer.class, customerRepository.findAll());
Grid grid = new Grid(container);
Pour éditer chaque ligne, le bouton a été créé:
Button edit = new Button("Edit", clickEvent -> openWindow((Customer) grid.getSelectedRows().iterator().next()));
Cela ouvre une nouvelle fenêtre avec le formulaire d'édition. Une fois toutes les modifications acceptées, je dois actualiser manuellement la page entière pour afficher les modifications sur la grille. Ma question est:
Comment actualiser uniquement la grille après modification d'une entrée de ligne? Et comment enregistrer ces modifications dans la base de données (peut-être que beanItemContainer pourrait le faire)?
C'est un bug. La grille ne se met pas à jour automatiquement une fois les modifications apportées au conteneur sous-jacent, ni aucune méthode raisonnable pour l'actualisation. Plusieurs problèmes se posent autour de ce problème, à savoir:.
grid.clearSortOrder();
ou
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();
}
Double possible Mettre à jour la grille avec un nouvel ensemble de données, dans l'application Vaadin 7.4
Avec Vaadin 8, les opérations suivantes permettent d’actualiser la grille après l’ajout ou la suppression de lignes ou la modification des données sous-jacentes:
grid.getDataProvider().refreshAll();
Depuis Vaadin 7.7.4, il existe une méthode refreshRows(Object ... itemIds)
et une méthode refreshAllRows()
dans la grille: https://dev.vaadin.com/ticket/16765
Je devais appeler explicitement grid.setItems()
après chaque appel de l'événement saveListener
pour que mes données d'actualisation de la grille Vaadin 8.3 à l'intérieur de la grille. Il est étrange que l’état de la grille visuelle fasse not reflète les valeurs modifiées.
Mise en œuvre 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)
})
}
Il y a un moyen de résoudre le problème beaucoup mieux:
Vous devez obtenir la variable BeanItem
dans le conteneur et la transmettre à la fenêtre de votre éditeur. Là, vous pouvez changer le haricot lui-même en l’évaluant à travers la variable BeanItem
s Properies
. C’est un travail très manuel, j’utilise donc toujours databindg de FieldGroup
- il suffit d’appeler bind
(champ, "propertyName"); où propertyName est la méthode d'accesseur en lecture sans get et sans lettre majuscule.