2017-07-18 30 views
1

我正在使用寫入版本8的新應用程序(當前使用8.1.0.rc2進行測試)。Grid SelectionMode.MULTI缺少標題複選框以選擇所有BackEndDataProvider

當使用SelectionMode.MULTI時,圍繞出現在Grid的標題中的「全選」複選框出現問題。特別是,如果DataProvider執行InMemoryDataProvider時複選框出現並按預期運行,但當DataProvider執行BackEndDataProvider時複選框不出現。

下面的代碼創建兩個網格差別只在於它們是否使用InMemory或後端:

public class Test { 
    public void setName(String name) { 
     this.name = name; 
    } 
    public String getName() { 
     return name; 
    } 
    private String name; 
} 

public class TestView extends BaseView { 
    public TestView() { 
     super("Test"); 
     addComponent(new TestGrid(new TestDataProvider0())); 
     addComponent(new TestGrid(new TestDataProvider1())); 
    } 
} 

public class TestGrid extends Grid<Test> { 
    public TestGrid(DataProvider<Test, ?> dataProvider) { 
     setHeightByRows(4); 
     setSelectionMode(SelectionMode.MULTI); 
     setDataProvider(dataProvider); 
     addColumn(Test::getName).setCaption("Name"); 
    } 
} 

public class TestDataProvider0 extends AbstractDataProvider<Test, SerializablePredicate<Test>> implements 
     BackEndDataProvider<Test, SerializablePredicate<Test>> { 
    public Stream<Test> fetch(Query<Test, SerializablePredicate<Test>> query) { 
     List<Test> tests = new ArrayList<>(query.getLimit()); 
     for (int i = 0; i < query.getLimit(); i++) { 
      Test test = new Test(); 
      test.setName(String.valueOf(query.getOffset() + i)); 
      tests.add(test); 
     } 
     return tests.stream(); 
    } 
    public int size(Query<Test, SerializablePredicate<Test>> query) { 
     return 100; 
    } 
    public void setSortOrders(List<QuerySortOrder> sortOrders) { 
    } 
} 

public class TestDataProvider1 extends AbstractDataProvider<Test, SerializablePredicate<Test>> implements 
     InMemoryDataProvider<Test> { 
    public Stream<Test> fetch(Query<Test, SerializablePredicate<Test>> query) { 
     List<Test> tests = new ArrayList<>(query.getLimit()); 
     for (int i = 0; i < query.getLimit(); i++) { 
      Test test = new Test(); 
      test.setName(String.valueOf(query.getOffset() + i)); 
      tests.add(test); 
     } 
     return tests.stream(); 
    } 
    public int size(Query<Test, SerializablePredicate<Test>> query) { 
     return 100; 
    } 
    public SerializablePredicate<Test> getFilter() { 
     return null; 
    } 
    public void setFilter(SerializablePredicate<Test> filter) { 
    } 
    public SerializableComparator<Test> getSortComparator() { 
     return null; 
    } 
    public void setSortComparator(SerializableComparator<Test> comparator) { 
    } 
} 

這裏是網格的呈現方式: Screenshot

我錯過了在設定的一個關鍵步驟我的基於BackEnd的數據提供者/網格? related documentation似乎沒有解決這個問題。

是否有與此相關的已知問題?

是否全選無法通過設計?很明顯,這可能相互作用實在太差了對大數據集的延遲加載的概念...

+1

我做了一個快速示例,沒有過濾器,沒有什麼奇特的,使用'DataProvider.ofCollection(p人),它的行爲正常。你能分享一個[sscce](http://sscce.org)來重現你的問題嗎? – Morfic

+0

@Morfic我欣賞你看看,並指出這應該工作。我將開始從代碼中取出東西來查看問題出在哪裏。 – Rob

+0

@Morfic問題已根據進一步調查改寫。它看起來像用於實現InMemoryDataProvider的DataProvider,但在實現BackEndDataProvider時不起作用。任何想法爲什麼? – Rob

回答

1

MultiSelectionModelImpl有這個方法:

protected void updateCanSelectAll() { 
    switch (selectAllCheckBoxVisibility) { 
    case VISIBLE: 
     getState(false).selectAllCheckBoxVisible = true; 
     break; 
    case HIDDEN: 
     getState(false).selectAllCheckBoxVisible = false; 
     break; 
    case DEFAULT: 
     getState(false).selectAllCheckBoxVisible = getGrid() 
       .getDataProvider().isInMemory(); 
     break; 
    default: 
     break; 
    } 
} 

這表明,對於非內存的默認行爲提供程序將不顯示全選複選框,但可以通過將可見性設置爲VISIBLE來覆蓋此行爲。

調整原來的代碼在這裏:

public class TestGrid extends Grid<Test> { 
    public TestGrid(DataProvider<Test, ?> dataProvider) { 
     setHeightByRows(4); 
     MultiSelectionModel<Test> selectionModel = (MultiSelectionModel<Test>) setSelectionMode(SelectionMode.MULTI); 
     selectionModel.setSelectAllCheckBoxVisibility(SelectAllCheckBoxVisibility.VISIBLE); 
     setDataProvider(dataProvider); 
     addColumn(Test::getName).setCaption("Name"); 
    } 
} 

具體來說,需要此呼籲複選框出現實現BackEndDataProvider數據提供:

MultiSelectionModel<Test> selectionModel = (MultiSelectionModel<Test>) setSelectionMode(SelectionMode.MULTI); 
selectionModel.setSelectAllCheckBoxVisibility(SelectAllCheckBoxVisibility.VISIBLE); 

隨着這一變化,選擇 - 所有複選框現在出現: Fixed screenshot