2

我最近接到了一个 Vaadin 7 项目,之前的开发人员使用 Vaadin 7 Grid grid.addRow(obj) 向网格添加行。现在在 Vaadin 8 Grid 中添加了 grid.setItems(?Collection?),它完全清除了 grid.setItems() 上 Grid 中的数据。我观看了来自 Vaadin 的所有 YouTube 视频和所有堆栈溢出页面,但没有找到答案。

我确实发现这个论坛有很多人有同样的问题: https ://vaadin.com/forum#!/thread/15724440

这是我的工作,我并不为此感到自豪。基本上添加一个 ArrayList 作为我的示例,它使用了一个带有名字、姓氏、电子邮件和薪水的 Person 类。

@SpringUI(path = "/person")
@Theme("valo")
public class PersonForm extends UI{

    @Autowired
    PersonService personService;
    List<Person> entries = new ArrayList<Person>();
    private TextField firstName = new TextField("First Name");
    private TextField lastName = new TextField("Last Name");
    private TextField email  = new TextField("Email Address");
    private TextField salary  = new TextField("Salary");
    private Person person = new Person();
    private Grid<Person> grid = new Grid<>(Person.class);
    final private FormLayout layout = new FormLayout();

    @Override
    protected void init(VaadinRequest request){

        grid.getEditor().isEnabled();
        grid.setColumnOrder("firstName", "lastName",
                "email", "salary");

        layout.addComponent(firstName);
        layout.addComponent(lastName);
        layout.addComponent(email);
        Button save = new Button("Save", e-> {

            addPersonToGrid(new Person(firstName.getValue(), lastName.getValue(), email.getValue(),salary.getValue()));

            Notification.show("PERSON WAS SAVED");
        });

        layout.addComponent(save);
        layout.addComponent(grid);
        layout.setMargin(true);
        setContent(layout);

    }

    public void addPersonToGrid(Person person){
        entries.add(person);
        grid.setItems(entries);
    }
}
4

1 回答 1

5

您是正确的,因为 Vaadin8 中不再有 addRow / addBean 方法。但是,您可以使用非常简洁的 DataProvider 而不是使用旧的 BeanItemContainer。您现在可以直接在 DataProvider 上设置 Filters 和 SortOrders。

像这样使用 DataProvider 会更容易:

private ListDataProvider<Person> provider = ListDataProvider.ofCollection(entries);

@Override
protected void init(VaadinRequest request){
  grid.setDataProvider(provider);
  ........
}

public void addPersonToGrid(Person person){
    entries.add(person);
    provider.refreshAll();
}

public void editPersonToGrid(int idx, Person person){
    entries.set(idx, person);
    provider.refreshItem(person);
}

它不像调用 entry.add(person) 和自动处理其他所有内容那样简洁,但它适用于大型数据集,并且如果您使用过滤器和排序,则非常方便。

于 2017-07-10T11:28:24.460 回答