相同的Datagrid组件 ,不同对象之间的另类拖动 并非默认的移动和复制

需求:

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值