需求:
下图 .三个区域 都是相同的一个DtableGrid(自己继承datagrid) 组件, 希望能实现将下级更改到不同的上级条目下
?
C -> B
B -> A
?
其他拖动是不允许的. 其实说白了.就是给儿子换个新爸爸, 孙子不能换爷爷,更不能给儿子或者孙子换新爸爸或者新爷爷
?
先看图:
?
?
demo:
?
?
代码:
?
1。 继承的datagrid 需要 开启 允许拖出和拖入
?
dragEnabled="true" dropEnabled="true"
?2。 重写dragStartHandler 拖动发起事件
/** * 拖动发起操作 加入 sourceDataLoaderClass */ override protected function dragStartHandler(event:DragEvent):void { if (event.isDefaultPrevented()) return; var dragSource:DragSource = new DragSource(); dragSource.addData(this.id,"tableID"); addDragData(dragSource); DragManager.doDrag(this, dragSource, event, dragImage, 0, 0, 0.5, dragMoveEnabled); }
?3。 重写dragEnterHandler 拖入对象上方触发
/** * 放入组建上方 判断是否可以拖放 拖动开始,代码不再修改 */ override protected function dragEnterHandler(event:DragEvent):void { if(!event.dragSource.hasFormat("tableID")){ cancelDragEvent(event); return; } var dragSource:DtableGrid = event.dragInitiator as DtableGrid; var dragTarget:DtableGrid = DtableGrid(event.currentTarget); if(dragSource.dataLoaderClass.level-dragTarget.dataLoaderClass.level==1){// 文件对案卷 案卷对项目 DragManager.acceptDragDrop(dragTarget); // DragManager.showFeedback(DragManager.LINK); // 默认是加入 }else{ cancelDragEvent(event); } super.dragEnterHandler(event); }
?说明: 这里写放置到不同对象上,判断是否可以允许拖入,动态改变鼠标指针图标等信息
4。 重写 dragDropHandler 拖动释放事件
/** * 拖动释放事件 */ override protected function dragDropHandler(event:DragEvent):void { var dragSource:DtableGrid = event.dragInitiator as DtableGrid; //目标dtablegrid var dragTarget:DtableGrid = DtableGrid(event.currentTarget); //返回将放置项目添加到放置目标中的位置的索引 var targetRowItem:Object ; var dropLoc:int = dragTarget.calculateDropIndex(event); if(dropLoc >= ArrayCollection(dragTarget.dataProvider).length){ //不在row内释放的话. cancelDragEvent(event); super.dragExitHandler(event); return; } targetRowItem = dragTarget.dataProvider.getItemAt(dropLoc); var caneditDIC:Dictionary = dragSource.getSeleDidsAndIndex("CANEDIT"); var sourceIndexs:Array = caneditDIC["indexArray"]; var dids:String = caneditDIC["dids"]; var libcode:int = dragSource.dataLoaderClass.libcode; var level:int = dragSource.dataLoaderClass.level; var pid:int = targetRowItem["DID"] as int; super.hideDropFeedback(event); ///开始加入操作 CairngormEventDispatcher.getInstance().dispatchEvent(new ChangePIDClassEvent(libcode,level,pid,dids,moveToSuccess)); /** * 回调 .移出正确加入后选择的条目 */ function moveToSuccess():void{ for each(var _delIndex:int in sourceIndexs){ (dragSource.dataProvider as ArrayCollection ).removeItemAt(_delIndex); } } }
?5。 覆盖dragCompleteHandler 方法
/** * 不能少 ,用来屏蔽flex默认拖放结束操作. */ override protected function dragCompleteHandler(event:DragEvent):void { //null }
?说明: 该方法是用来屏蔽datagrid默认的拖放完成事件, 默认只有move 和copy ,如果你需要自定义完成事件 就在
?
dragDropHandler 拖动释放事件中写(因为能获取到拖动对象和拖入对象) , 保持 dragCompleteHandler为空即可
?
5。
/** * 取消拖放 */ private function cancelDragEvent(event:DragEvent):void{ DragManager.showFeedback(DragManager.NONE); super.hideDropFeedback(event); event.preventDefault(); }?
?
?