【发布时间】:2015-09-30 02:29:12
【问题描述】:
目前,我使用的是 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 列表。如果有包含 ChildDto 列表的 ParentDto 数据,我想在树形网格中显示它。我使用此链接中的基本树形网格 https://www.sencha.com/examples/#ExamplePlace:basictreegrid
使用该引用,如果我尝试添加 1 个 ParentDto 一切正常,但当我添加许多 ParentDto 时出现问题。 这是我将数据添加到 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 个具有 1 个子 (childA) 的 ParentDto (parentA) 时。结果将是
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个Store,第一个是TreeStore,第二个是ListStore。每次添加父子时,我都会将它们插入到 TreeStore 和 ListStore。在 ListStore 中,我保持父子索引始终与网格的视角相匹配,这样每当触发 addBeforeRenderIconCellEventHandler 时,我都会使用 ListStore 来获取数据。
在我看来,这个解决方案还不够好,但是因为在我的情况下,最多可以将小于 50 的数据添加到存储中,就足够了。
【问题讨论】:
标签: gxt