2017-07-07 5 views
1

私は最近、以前の開発者がVaadin 7 Grid grid.addRow(obj)を使ってグリッドに行を追加するVaadin 7プロジェクトを手渡しました。 Vaadin 8 Gridでは、grid.setItems(?Collection?)が追加され、grid.setItems()のGrid内のデータが完全に消去されます。 VaadinのすべてのYouTube動画とすべてのスタックオーバーフローページを見て、答えが見つからなかった。私は同じ問題を持つ人々の束と、このフォーラムを見つけたVaadin 8 Gridはもうグリッドを持っていませんでした

https://vaadin.com/forum#!/thread/15724440

ここでは、周りの私の仕事であり、私はそれを誇りに思っていませんよ。私の例として、基本的にArrayListを追加すると、firstName、lastName、email、salaryの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); 
    } 
} 

答えて

3

Vaadin8では、addRow/addBeanメソッドが存在しないという点で正しいです。 しかし、古いBeanItemContainerを使用するのではなく、きちんとしたDataProviderを使用することができます。 DataProviderでは、FiltersとSortOrdersを直接設定できます。

このようなデータプロバイダを使用することが容易になるだろう:

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); 
} 

それだけで(人を)entries.add呼び出し、他のすべてが自動的に処理されている限り簡潔ではありませんが、それは大規模なデータセットで動作し、フィルタと並べ替えを使用すると非常に便利です。

+0

ありがとうございます! –

関連する問題