我正在开发的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个任务,我担心如果我必须遍历所有子项以应用过滤器功能,那么性能将会很差。我可以只过滤显示的项目吗?
也许我会以错误的方式解决这个问题,任何指导都会非常受欢迎。
由于
答案 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;
}
}