Flex - 使用分层数据过滤AdvancedDataGrid

时间:2015-04-27 10:04:21

标签: actionscript-3 flex filter hierarchical-data advanceddatagrid

我正在开发的Flex应用程序中显示项目计划任务,我正在尝试过滤AdvancedDataGrid(ADG)中显示的项目,以便只显示比用户选择的日期晚开始的任务。

这是一个VoTask类:

false

大多数任务都是父摘要任务的子项,这种层次结构可以是大约5深。

在我的模型中,来自SQL数据库的任务数据的平面数组被放入ArrayCollection中,作为名为 public class VoTask { public var taskId:int; public var taskProjectId:int; public var taskParentId:int; public var taskName:String; public var taskStartDate:Date; public var taskEndDate:Date; public var taskType:String; public var taskStatus:String; public var children:/*Task*/Array; // Constructor. public function VoTask() { } } 的强类型Task对象的集合。

为了准备数据以显示为层次结构,我有一个函数,它遍历tasksFlat ArrayCollection,并使用taskParentId将每个任务放入适当的子项中。其母公司的财产。这为我提供了一个tasksFlat ArrayCollection,其中包含一个顶级父Task和所有剩余的任务,这些任务在这个层次结构中作为子级组织。

我的AdvancedDataGrid目前看起来像这样:

tasksHierarchical

用户界面包括DateChooser。目前,当日期更改时,我应用filterFunction(在我的Presenter中),如下所示:

<mx:AdvancedDataGrid
        id="myADG"
        displayItemsExpanded="false"
        horizontalScrollPolicy="auto"
        headerStyleName="adgHeaderStyle"
        creationComplete="{presenter.onTasksAdvancedDataGridCreationComplete(event)}"
        width="100%" height="100%">

<mx:dataProvider>
    <mx:HierarchicalData source="{presenter.tasksHierarchical}" childrenField="children"/>
</mx:dataProvider>

    <mx:columns>
        <mx:AdvancedDataGridColumn id="nameAdvancedDataGridColumn" dataField="taskName" headerText="Task" width="650"/>
        <mx:AdvancedDataGridColumn dataField="taskStatus" headerText="Status" width="72"/>
        <mx:AdvancedDataGridColumn id="startDateAdvancedDataGridColumn" dataField="taskStartDate" headerText="Start" width="160"/>
        <mx:AdvancedDataGridColumn id="endDateAdvancedDataGridColumn" dataField="taskEndDate" headerText="End" width="160"/>
        <mx:AdvancedDataGridColumn headerText="" width="64"/>
    </mx:columns>

    <mx:rendererProviders>

        <mx:AdvancedDataGridRendererProvider
                column="{startDateAdvancedDataGridColumn}"
                renderer="itemRenderers.TaskStartDate_ItemRenderer"/>

        <mx:AdvancedDataGridRendererProvider
                column="{endDateAdvancedDataGridColumn}"
                renderer="itemRenderers.TaskEndDate_ItemRenderer"/>

    </mx:rendererProviders>

</mx:AdvancedDataGrid>

在调试时,我发现只有顶级父任务正在响应过滤器功能。

用户可以探索大约4000个任务,我担心如果我必须遍历所有子项以应用过滤器功能,那么性能将会很差。我可以只过滤显示的项目吗?

也许我会以错误的方式解决这个问题,任何指导都会非常受欢迎。

由于

1 个答案:

答案 0 :(得分:0)

当您对ArrayCollection应用过滤时,它始终会应用于第一级。在您的情况下,您需要递归地应用过滤,或者您可以覆盖HierarchicalData.getChildren(node:Object):Object,这将允许您访问过滤第一级子项,以及为子项调用过滤方法到任何第n级的能力水平。

Class MyCollection extends HierarchicalData
{
  override public function getChildren(node:Object):Object 
  {
    if (node is a VoTask )
        (node.children as ArrayCollection).filterFunction = tasksFilterFunction;
        node.children.refresh();
    else if (node is a Task)
        (node.children as ArrayCollection).filterFunction = tasksFilterFunction;
        node.children.refresh();
    // You can also write a more complex process of filtering.

    return node;
  }
}