目前,我正在使用gxt 3.0.6
我有一个TreeStore让我们称它为“treeStore”,模型数据为“ParentDto”。
private TreeStore<ParentDto> treeStore;
treeStore = new TreeStore<ParentDto>(new ModelKeyProvider<ParentDto>(){
@Override
public String getKey(ParentDto item){
return String.valueOf(item.getParentId());
}
});
在ParentDto中有一个ChildDto列表。如果有ParentDto数据有ChildDto列表,我想在树状网格中显示它。我从这个链接使用基本树网格 https://www.sencha.com/examples/#ExamplePlace:basictreegrid
使用该引用,如果我尝试添加1个ParentDto,一切正常,但问题是当我添加许多Parent Dto时。 这是我将数据添加到treeStore
的代码public void fillTreeStore(List<ParentDto) listParent){
treeStore.clear();
for(ParentDto parentDto : listParent){
treeStore.add(parentDto);
if(parentDto.getListChild().size() > 0){
for(ChildDto childDto : parent.getListChild()){
treeStore.add(parentDto,childDto);
}
}
}
在我的情况下,我只需要1级父子树,所以这段代码就足够了。 我尝试调试我的代码使用这个表达式
treeStore.getAll().get(index);
当我添加1个ParentDto(parentA)时,它有1个Child(childA)。结果将是
treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain childA
但是如果我添加2个ParentDto(parentA,parentB)并且每个都有1个子节点(childA,childB)。结果将是
treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain parentB
treeStore.getAll().get(2) -> contain childA
treeStore.getAll().get(3) -> contain childB
但在网格中,这些数据将完全展现出来:
row 1 : parentA (this row can expand)
row 2 : childA (the expanded row form parentA)
row 3 : parentB (this row can expand)
row 4 : childB (the expanded row form parentB)
如果数据是“父”,我需要渲染图标,所以我使用这段代码:
(icon_variable).addBeforeRenderIconCellEventHandler(new BeforeRenderIconCellEventHandler() {
@Override
public void onBeforeRenderIconCell(BeforeRenderIconCellEvent event) {
if(treeStore.getParent(treeStore.get(event.getSelectedRowIndex())) == null){
//#render icon here
}
}
});
问题在于此代码
treeStore.get(event.getSelectedRowIndex())
添加parentB后,它将触发addBeforeRenderIconCellEventHandler方法。 event.getSelectedRowIndex()
将根据“网格视角”获取行索引。在第二行,从网格的角度来看(childA),event.getSelectedRowIndex()
将返回1.但是从“treeStore的角度来看”,索引1是“parentB”,所以我的图标渲染混乱了。
这就是为什么,我在treeStore中需要的结果是这样的
treeStore.getAll().get(0) -> contain parentA
treeStore.getAll().get(1) -> contain childA
treeStore.getAll().get(2) -> contain parentB
treeStore.getAll().get(3) -> contain childB
我的解决方案: 为了解决这个问题,我现在使用2个商店,第一个是TreeStore,第二个是ListStore。每次添加父级和子级时,我都会将它们插入TreeStore和ListStore。在ListStore中,我保持父和子的索引始终与网格的透视图匹配,这样每当触发addBeforeRenderIconCellEventHandler时,我都使用ListStore来获取数据。
在我看来,这个解决方案还不够好,但因为在我的情况下,最大数据可以添加到商店中小于50,这就足够了。
答案 0 :(得分:0)
看起来这是默认行为。你没有说出你想要做的是什么,但我猜你可以用它们提供的方法来做。我猜你试图通过查看父母及其所有孩子来遍历树,然后再转到下一个父母。像这样的东西就可以做到。
for (ParentDto parent : treeStore.getRootItems()){
for (ChildDto child : treeStore.getChildren(parent)){
}
}