Как отменить/не принять операцию перетаскивания в Flex 3?

Цель: позволить пользователю удалить запись, перетащив строку из AdvancedDataGrid на значок корзины и подтвердив, что пользователь намеревался это сделать, с помощью всплывающего предупреждения с кнопками "ОК" и " кнопки «Отмена».

What is working:

  • Перетаскивание строки на значок корзины.
  • Если пользователь нажимает кнопку «ОК», запись удаляется.
  • Если пользователь нажимает кнопку «Отмена», операция отменяется.

Проблема. После того, как пользователь нажмет кнопку "Отмена" и всплывающее окно закроется, строки в ADG нельзя будет перетащить. Я обнаружил, что после сортировки ADG, щелкнув заголовок столбца, пользователь может снова начать перетаскивание строк.

Код: (изменен по сравнению с исходным сообщением)

<mx:Image source="{trashImage}" buttonMode="true" 
toolTip="drag a participant here to delete them from the project"
dragDrop="deleteParticipantDrop(event)" dragEnter="deleteParticipantEnter(event)" 
dragExit="deleteParticipantDragExit(event)" top="4" right="122" id="image2" />  

// trashImage Event Handlers:
private function deleteParticipantEnter(event:DragEvent):void
{
    var component:IUIComponent = IUIComponent(event.currentTarget);
    dragComponent = component;
    DragManager.acceptDragDrop(component);
    DragManager.showFeedback(DragManager.MOVE);
    deleteParticipantDragEvent = event;
}

private function deleteParticipantDrop(event:DragEvent):void
{
    var selectedKitNum:String = memberRpt.selectedItem.KitNum;
    var selectedName:String = memberRpt.selectedItem.ParticipantName;
    var component:IUIComponent = IUIComponent(event.currentTarget);
    dragComponent = component;
    DragManager.acceptDragDrop(component);
    isEditingParticipantInfo = false;
    isDeletingParticipant = true;
    deleteParticipantDropEvent = event;
    event.stopImmediatePropagation(); // Added as per mrm
    alert.confirm("Are you sure you want to delete this participant, Kit #" + memberRpt.selectedItem.KitNum + " ("  + 
        memberRpt.selectedItem.ParticipantName + ") from the project?  This cannot be reversed!!  An email will be " +
        "sent to notify this participant and you will receive a copy of it for your records.", confirmRemoveParticipant);
}

private function deleteParticipantDragExit(event:DragEvent):void
{
    var component:IUIComponent = IUIComponent(event.currentTarget);
    dragComponent = component;
    DragManager.acceptDragDrop(component);
    DragManager.showFeedback(DragManager.NONE);
}

private function confirmRemoveParticipant(event:CloseEvent):void
{
    if (event.detail == Alert.YES)
    {
        deleteReason = DeleteParticipantTitleWindow(PopUpManager.createPopUp( this, DeleteParticipantTitleWindow , true));
        dispatchEvent(deleteParticipantDropEvent); // Added as per mrm
        PopUpManager.centerPopUp(deleteReason);
        deleteReason.showCloseButton = true;
        deleteReason.title = "Reason for removal from project";
        deleteReason.addEventListener("close", cleanupRemoveParticipant);
        deleteReason["cancelButton"].addEventListener("click", cleanupRemoveParticipant);
        deleteReason["okButton"].addEventListener("click", finalizeDeleteParticipant);
        isDeletingParticipant = false; 
    }
    else
    {
        cleanupRemoveParticipant();
    }
}

private function cleanupRemoveParticipant(event:Event = null):void
{
    memberRpt.invalidateDisplayList();
    memberRpt.executeBindings();
    if (deleteReason != null)
    {
        PopUpManager.removePopUp(deleteReason);
        deleteReason = null;
    }
}

public function finalizeDeleteParticipant(event:Event):void
{
    if (deleteReason.reason.text != null)
    {
        selectedReportItem = memberRpt.selectedItem;
        selectedReportItemIndex = memberRpt.selectedIndex;
        memberReportData.removeItemAt(selectedReportItemIndex);
    }
    else
    {
        alert.info("You must provide a reason for removing a participant from your project!!");
    }

    cleanupRemoveParticipant();
}

Заранее спасибо за все полезные предложения.


person Sean Staats    schedule 21.10.2008    source источник


Ответы (6)


Вы пытались запустить метод validateNow() в ADG после события отмены?

Вот еще немного информации о методе validateNow().

Почему вам нужно знать о validateNow...

Я действительно думаю, что это то, что вы ищете! Пожалуйста, дайте нам знать, если это так...

person defmeta    schedule 25.10.2008

Попробуйте обновить привязки данных в сетке данных с помощью executeBindings и/или invalidateDisplayList в закрывающем элементе управления.

Если честно, это немного похоже на баг. Вы разместили это на flexcoders? Ребята из Adobe тусуются там (вероятно и здесь, но точно там)

person Simon    schedule 21.10.2008

Подождите... только что заметил, что между событием перетаскивания и кнопкой отмены во всплывающем окне есть асинхронный вызов веб-службы, который, по-видимому, обрабатывается GetParticipantOrderInformation. Это правильно?

Если да, то пытались ли вы предложить более простой диалог для отмены, прежде чем сделать это? Интересно, вызывает ли проблема комбинация слоев событий?

person Simon    schedule 21.10.2008

Мне не удалось обновить привязки данных в сетке данных с помощью методов executeBindings и invalidateDisplayList. Мне также не повезло, показав предупреждение о подтверждении перед вызовом веб-сервиса. На самом деле я обнаружил, что вызов веб-сервиса совершенно не нужен, и удалил его. Итак, теперь код выглядит следующим образом:

  1. Перетащите строку ADG на значок корзины.
  2. Отображение окна подтверждения с предупреждением.
  3. Если пользователь нажал кнопку «Отмена», повторно отобразится ADG.

Но та же проблема сохраняется. Я обновлю раздел Код последним кодом.

person Sean Staats    schedule 21.10.2008

Вот идея: - Непосредственно перед созданием окна предупреждения остановите DragEvent.

event.stopImmediatePropagation();
  • сохранить событие, чтобы мы могли возобновить работу, если пользователь нажмет кнопку «Да»
queuedEvent = event as DragEvent;
  • показать окно предупреждения
  • если пользователь нажимает кнопку «да», возобновляет событие в очереди
dispatchEvent(queuedEvent);
person mrm    schedule 22.10.2008

DragManager.showFeedback(DragManager.NONE);

person Community    schedule 20.01.2009