[英]Flex - Filtering an AdvancedDataGrid with Hierarchical Data
我正在开发的Flex应用程序中显示项目计划任务,并且试图过滤AdvancedDataGrid(ADG)中显示的项目,以便仅显示在用户选择的日期之后开始的任务。
这是一个VoTask类:
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() {
}
}
大多数任务都是父级摘要任务的子级,此层次结构的深度约为5个。
在我的模型中,将来自SQL数据库的平坦的Task数据数组作为强类型Task对象(称为tasksFlat
的集合放入ArrayCollection中。
为了准备将数据显示为层次结构,我有一个函数,它遍历tasksFlat
ArrayCollection,并使用taskParentId将每个Task放入其父级的相应“ children”属性中。 这为我提供了一个tasksHierarchical
ArrayCollection,其中包含单个顶级父Task和所有其余Task,在其中按子层次结构组织。
我的AdvancedDataGrid当前看起来像这样:
<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>
用户界面包括DateChooser。 当前,当日期更改时,我按以下方式应用filterFunction(在Presenter中):
private function onSelectedDateChanged(event:Event):void {
// Set the filterFunction for the tasks data.
tasksHierarchical.filterFunction = tasksFilterFunction;
// Refresh the tasks AdvancedDataGrid data source.
tasksHierarchical.refresh();
}
private function tasksFilterFunction(obj:Object):Boolean{
//the logic to decide if an element needs to be shown or not.
var _task:VoTask = VoTask(obj);
var _returnValue:Boolean;
if (_task.taskEndDate < model.selectedDate) {
_returnValue = false;
} else {
_returnValue = true;
}
return _returnValue;
}
在调试时,我发现只有顶级父任务正在响应过滤器功能。
用户需要探索大约4000个任务,而且我担心如果必须遍历所有子代以应用过滤器功能,性能将会很差。 我可以仅过滤显示的项目吗?
也许我走错路了,任何指导都将受到欢迎。
谢谢
当您将过滤应用于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;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.