web-dev-qa-db-fra.com

Vaadin - Actualise la grille après modification de la ligne

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

8
jsosnowski

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

9
kukis

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();
10
Harald Hetzner

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

1
user1411778

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 BeanItems 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.

0
Veselin M