2008-10-21 3 views
2

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

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

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

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

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

ответ

0

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

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

0

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

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

0

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

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

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

0

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

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

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

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

Why you need to know about validateNow...

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

0

DragManager.showFeedback (DragManager.NONE);

Смежные вопросы