将AdvancedDataGrid的分组数据拖放到DataGrid中

如果AdvancedListBase组件如AdvancedDataGrid没有用分组数据,拖放时会当成是DataGrid,因此可以很方便地拖放到ListBase组件如DataGrid或List中。但如果用分组数据,又怎么实现这个功能呢?Flex的帮助文件没有讲,网上这方面的资料也很少,本文将以AdvancedDataGrid和DataGrid为例讲述。

实现功能:选择AdvancedDataGrid中一个或多个叶节点项目,选择一个或多个子节点项目,同时选择一个或多个叶节点项目和一个或多个子节点项 目,拖放到DataGrid中。拖放操作有三个主要的类:DragManager、DragSource和DragEvent,其中DragEvent是最核心的。可以为DataGrid(拖放目标)添加DragEvent类事件侦听器 函数测试一下,结果不起任何作用。如果看过AdvancedListBase和ListBase及其子类的源码,就知道原因了。以dragEnterHandler处理方法为例:

protected function dragEnterHandler(event:DragEvent):void
{
    if (event.isDefaultPrevented())
    return;

    lastDragEvent = event;

    if (enabled && iteratorValid && event.dragSource.hasFormat("items"))
    {
    DragManager.acceptDragDrop(this);
    DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
    showDropFeedback(event);
    return;
    }

    hideDropFeedback(event);

    DragManager.showFeedback(DragManager.NONE);
}

很简单,它首先要检测要检测的被拖动的数据是否包含使用相应格式的数据,因为AdvancedDataGrid的分组数据的格式不是items而是 treeDataGridItems,因此我们得用DataGrid子类重写drapOverHandler等DragEvent方法,添加对treeDataGridItems数据格式的支持。如:

override protected function dragEnterHandler(event:DragEvent):void
{
    super.dragEnterHandler(event);

    if (enabled && iteratorValid && event.dragSource.hasFormat("treeDataGridItems"))
    {
        DragManager.acceptDragDrop(this);
        DragManager.showFeedback(event.ctrlKey ? DragManager.COPY : DragManager.MOVE);
        showDropFeedback(event);
        return;
    }
}

点击此处查看本实例的效果,点击此处下载本实例的源码。

所以说,搞清楚AdvancedDataGrid和DataGrid拖放的工作原理,实现起来就不难了。至于反过来怎样将DataGrid的项目拖放到AdvancedDataGrid上,原理都一样,此处就不再说了。另外,我在dragDropHandler方法中添加了同时选择拖放AdvancedDataGrid子节点项目的功能,感兴趣的可以参考一下。值得注意的是,如 果拖放的是AdvancedDataGrid子节点项目,在DataGrid中不会按原来的排列顺序显示。因此设置了DataGrid的dragEnabled和dragMoveEnabled属性为true,这样就可以在DataGrid 内部中调整项目的顺序了。

发表评论