Vaadin 14 - 使用呈现的删除按钮删除一行网格

Vaadin 14 - remove a row of a grid by using rendered delete button

我的网格引用了一个 MySQL 数据库 table。

this.grid   = new Grid<>(Person.class, false);

然后我添加了我的属性列以及链接到 ui 的呈现组件的列,其中包含我的删除按钮。

this.grid.addColumn(RenderedComponent.Renderer(DeleteButton::new))

因此在网格的每一行中都有一个要删除的按钮。

我的问题是我不知道如何获取引用按钮所在行的 bean。 因为当我拥有它时,我希望可以在单击按钮时执行此操作:

new PersonDAO().remove(bean);

然后刷新网格。

在列渲染器中,您可以访问该项目。您只是还没有使用它来创建按钮。而不是

this.grid.addColumn(RenderedComponent.Renderer(DeleteButton::new))

你可以这样做

this.grid.addComponentColumn(item -> new DeleteButton(item));

并更改您的 DeleteButton class 以期望构造函数中的该项目。您现在可以使用该项目将其从点击侦听器中的数据库中删除

如果你也想刷新网格,你还必须知道clicklistener中的网格。也可以将网格传递到 DeleteButton 中,或者您可以在 DeleteButton class 之外定义点击监听器。这可能会使您的 DeleteButton class 过时,除非它具有一些自定义样式或其他增强功能。

// using Button instead of DeleteButton for clarity
this.grid.addComponentColumn(item -> new Button("Delete", click -> {
    this.personDao.remove(item); // NEVER instantiate your service or dao yourself, instead inject it into the view
    this.grid.getDataProvider().refresh();
}));