当前位置: 代码迷 >> Web前端 >> 雷同的Datagrid组件 ,不同对象之间的另类拖动 并非默认的移动和复制
  详细解决方案

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

热度:99   发布时间:2012-10-27 10:42:26.0
相同的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();
			}
?

?

?

  相关解决方案