需求:
下图 .三个区域 都是相同的一个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();
}