Flex Advanced Data Grid с иерархическими данными: как получить доступ к полям currentTarget в событии dragdrop? - PullRequest
1 голос
/ 08 февраля 2011

Так что это сводит меня с ума. У меня есть расширенная сетка данных с поставщиком данных, который представляет собой массив массивов с иерархическими данными. Каждый объект (включая детей) имеет поле идентификатора. Я пытаюсь перетащить данные из ADG. Когда это произойдет, мне нужно взять идентификатор с цели и изменить поле парентид перетаскиваемого объекта. Вот что у меня есть:

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!";}
        )
    );
}

Я могу получить доступ к данным, которые я перетаскиваю (следовательно, изменяю parentId), но не к currentTarget. Я думаю, что иерархические данные являются частью проблемы, но я не могу найти много в документации? Есть мысли?

Ответы [ 2 ]

2 голосов
/ 03 марта 2015
var dropData:Object = mx_internal::dropTarget._dropData; 

должно быть

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

Попробуйте это.

2 голосов
/ 10 февраля 2011

event.currentTarget это не узел, это сам ADG.Однако получить необходимую информацию довольно просто, поскольку ADG хранит эти данные внутри себя (как mx_internal).

Я использую следующие фрагменты кода (протестированные с Flex SDK 4.1) в *Обработчик 1005 *, но я думаю, он будет работать и в обработчике 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;
}
...