2

目标: 允许用户通过从 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();
}

提前感谢所有有用的建议。

4

6 回答 6

1

您是否尝试在取消事件后在 ADG 上运行 validateNow() 方法?

这是有关 validateNow() 方法的更多信息。

为什么您需要了解 validateNow...

我真的认为这就是你要找的东西!如果是这种情况,请告诉我们...

于 2008-10-25T20:28:04.637 回答
0

DragManager.showFeedback(DragManager.NONE);

于 2009-01-20T13:23:41.663 回答
0

尝试使用封闭控件中的 executeBindings 和/或 invalidateDisplayList 刷新数据网格上的数据绑定。

老实说,这听起来有点像一个错误。你在flexcoders上发布过这个吗?Adobe 的人在那里闲逛(可能也在这里,但肯定在那里)

于 2008-10-21T20:30:55.653 回答
0

等等……刚刚发现在弹出事件和取消按钮之间有一个异步 Web 服务调用,它似乎由 GetParticipantOrderInformation 处理。那是对的吗?

如果是,那么在您这样做之前,您是否尝试过为“取消”提供一个更简单的对话框?我想知道事件层的组合是否会导致问题。

于 2008-10-21T20:41:01.903 回答
0

通过 executeBindings 和 invalidateDisplayList 方法刷新数据网格上的数据绑定没有任何成功。在进行网络服务调用之前显示确认警报,我也没有任何运气。事实上,我发现完全没有必要进行 web 服务调用并将其删除。所以现在代码流程如下:

  1. 将 ADG 行拖放到垃圾桶图标上。
  2. 显示确认警报框。
  3. 如果用户单击“取消”按钮,则重新显示 ADG。

但同样的问题仍然存在。我将使用最新代码更新代码部分。

于 2008-10-21T23:05:06.980 回答
0

这是一个想法: - 就在您创建警报窗口之前,停止 DragEvent

event.stopImmediatePropagation();
  • 存储事件,以便在用户单击“是”按钮时我们可以恢复
queuedEvent = 作为 DragEvent 的事件;
  • 显示警报窗口
  • 如果用户单击“是”按钮,则恢复排队的事件
调度事件(排队事件);
于 2008-10-22T01:34:09.007 回答