2008-10-21 92 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

嘗試使用executeBindings和/或invalidateDisplayList在包圍控制數據網格刷新數據綁定。

老實說這聽起來有點像一個錯誤。你有沒有發佈這個flexcoders? Adobe的傢伙掛在那裏(可能這裏,但肯定有)

0

掛在...剛剛發現了丟棄事件和彈出窗口的取消按鈕之間有這似乎是一個異步調用Web服務由GetParticipantOrderInformation處理。那是對的嗎?

如果是的話,那麼你嘗試,爲你做到這一點之前取消一個簡單的對話?我想知道層層結合的事件是否會造成問題。

0

我沒有與刷新經由executeBindings和invalidateDisplayList方法DataGrid中的數據綁定任何成功。在進行web服務調用之前,我也沒有任何運氣顯示確認提醒。事實上,我發現使Web服務調用完全不必要,並將其刪除。所以現在代碼流如下:

  1. 將ADG行拖放到垃圾桶圖標上。
  2. 顯示確認提示框。
  3. 如果用戶點擊「取消」按鈕,重新顯示ADG。

但同樣的問題仍然存在。我會用最新的代碼更新代碼部分。

0

這裏有一個想法: - 您所創建的警告窗口之前,停止了的dragEvent

event.stopImmediatePropagation();
  • 商店的事件,所以如果用戶點擊Yes按鈕
queuedEvent = event as DragEvent;
我們可以重新開始
  • 顯示提醒窗口
  • 如果用戶點擊Yes按鈕,恢復排隊事件
dispatchEvent(queuedEvent);
1

您是否嘗試過取消事件後運行validateNow()方法的ADG?

以下是有關validateNow()方法的更多信息。

Why you need to know about validateNow...

我真的認爲這是你在找什麼!請讓我們知道如果是這樣的話...

0

DragManager.showFeedback(DragManager.NONE);