Как отменить / отменить операцию перетаскивания в Flex 3? - PullRequest
2 голосов
/ 22 октября 2008

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

Что работает:

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

Проблема: После того, как пользователь нажмет кнопку «Отмена» и всплывающее предупреждение закроется, никакие строки в 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();
}

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

Ответы [ 6 ]

1 голос
/ 26 октября 2008

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

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

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

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

0 голосов
/ 20 января 2009

DragManager.showFeedback (DragManager.NONE);

0 голосов
/ 22 октября 2008

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

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

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

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

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

0 голосов
/ 22 октября 2008

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

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

0 голосов
/ 22 октября 2008

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

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

...