繁体   English   中英

Flex-使用分层数据过滤AdvancedDataGrid

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM