具有分层数据的Flex高级数据网格:如何在dragdrop事件中访问currentTarget字段?

时间:2011-02-08 03:04:23

标签: flex drag-and-drop hierarchical-data advanceddatagrid

所以这让我发疯了。我有一个带有数据提供者的高级数据网格,这是一个带有分层数据的数组集合。每个对象(包括子对象)都有一个id字段。我正在尝试从ADG中拖放数据。当发生这种情况时,我需要从放置目标中获取id并更改拖动对象的parentid字段。这就是我所拥有的:

public function topAccountsGrid_dragDropHandler(event:DragEvent):void{  
    //In this function, you need to make the move, update the field in salesforce, and refresh the salesforce data...
    if(checkActivateAccountManageMode.selected == true) {
        var dragObj:Array = event.dragSource.dataForFormat("treeDataGridItems") as Array;
        var newParentId:String = event.currentTarget['Id'];
        dragObj[0].ParentId = newParentId;
    } else {
        return;
    }
    app.wrapper.save(dragObj[0], 
        new mx.rpc.Responder(
            function():void {
            refreshData();
        },
        function():void{_status = "apex error!";}
        )
    );
}

我可以访问我是draggin的数据(因此更改parentId),但不能访问currentTarget。我认为分层数据是问题的一部分,但我在文档中找不到多少?有什么想法吗?

2 个答案:

答案 0 :(得分:2)

event.currentTarget不是节点,而是ADG本身。但是,获取所需信息非常容易,因为ADG会在内部存储该数据(mx_internal)。

我在dragOver处理程序中使用以下代码段(使用Flex SDK 4.1测试),但我想它也可以在dragDrop处理程序中使用。

protected function myGrid_dragDropHandler(event:DragEvent):void
{
    // Get the dragged items. This could either be an Array, a Vector or NULL.
    var draggedItems:Object = getDraggedItems(event.dragSource);

    if (!draggedItems)
        return;

    // That's our ADG where the event handler is registered.
    var dropTarget:AdvancedDataGrid = AdvancedDataGrid(event.currentTarget);

    // Get the internal information about the dropTarget from the ADG.
    var dropData:Object = mx_internal::dropTarget._dropData;

    // In case the dataProvider is hierarchical, get the internal hierarchicalData aka rootModel.
    var hierarchicalData:IHierarchicalData = dropTarget.mx_internal::_rootModel;
    var targetParent:Object = null;

    // If it's a hierarchical data structure and the dropData could be retrieved
    // then get the parent node to which the draggedItems are going to be added.
    if (hierarchicalData && dropData)
        targetParent = dropData.parent;

    for each (var draggedItem:Object in draggedItems)
    {
        // do something with the draggedItem
    }
}

protected function getDraggedItems(dragSource:DragSource):Object
{
    if (dragSource.hasFormat("treeDataGridItems"))
        return dragSource.dataForFormat("treeDataGridItems") as Array;

    if (dragSource.hasFormat("items"))
        return dragSource.dataForFormat("items") as Array;

    if (dragSource.hasFormat("itemsByIndex"))
        return dragSource.dataForFormat("itemsByIndex") as Vector.<Object>;

    return null;
}

答案 1 :(得分:2)

var dropData:Object = mx_internal::dropTarget._dropData; 

应该是

var dropData:Object = dropTarget.mx_internal::_dropData;

试试这个。