GXT 在 TreeStore 中重新排列数据数组索引

Posted

技术标签:

【中文标题】GXT 在 TreeStore 中重新排列数据数组索引【英文标题】:GXT re-arrange data array index in TreeStore 【发布时间】: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 的数据添加到存储中,就足够了。

【问题讨论】:

【参考方案1】:

看起来这是默认行为。你没有说你想做什么,但我猜你可以用他们提供的方法来做。我猜您正在尝试通过查看父级来遍历树,然后查看所有子级,然后再转到下一个父级。这样的事情就可以了。

for (ParentDto parent : treeStore.getRootItems())
    for (ChildDto child : treeStore.getChildren(parent))
    

【讨论】:

您好,感谢您的回复。我需要在渲染图标单元格处理程序之前添加,当数据为“父”时,将渲染图标。在 onBeforeRenderIconCell 覆盖方法中,我使用 detailTreeStore.getAll().get(event.getSelectedRowIndex()) 来获取 Dto 并验证它是父级还是子级,但由于父级索引未插入到子级索引之后(如果我添加更多比一个父母),我的图标渲染搞砸了:( 尝试使用 getDepth()。我以前从未使用过它,但从 API 描述中听起来它会告诉你它是父母还是孩子。 dev.sencha.com/deploy/gxt-3.0.0/javadoc/gxt/com/sencha/gxt/data/… 它不起作用,因为要从 TreeStore 获取数据进行渲染,我仍然使用此代码“detailTreeStore.getAll().get(event.getSelectedRowIndex())”。我设法通过添加 1 个 ListStore 解决了这个问题。我认为这不是一个好的解决方案,但结果是我现在需要的。到目前为止感谢您的建议:) 我很想知道如果你在根项目上调用 getParent() 会发生什么?它返回 null 吗? 太棒了。您应该能够检查 null 以查看它是父母还是孩子。这能解决您的问题吗?

以上是关于GXT 在 TreeStore 中重新排列数据数组索引的主要内容,如果未能解决你的问题,请参考以下文章

如何重新排列数组中的数据,使两个相似的项目不相邻?

Ext JS 4:过滤 TreeStore

重新排列数组中的字母并检查排列是不是在数组中

如何在numpy中优雅地通过子数组重新排列数组?

模型数据接口 gxt

GXT 分页网格