如何防止为拖动列表或DataGrid中的某些项?
假设我有一个清单,上面有两个项目:“汤姆”和“曾傑瑞”。只有“汤姆”应该是可拖的,而不是“曾傑瑞”。
理想情况下,我有一个'isDragEnabled(item:Object):Boolean‘函数,它是由拖动源查询的。
我的困难开始于'dragStart‘事件处理程序对于dragSource有一个空值,所以从一开始我就发现很难找到拖放启动是关于什么的。
提前感谢!
PS有一些关于防止或取消一个下降的讨论,但我没有看到多少关于防止拖曳开始,因此这个问题。
发布于 2010-03-23 09:08:33
好的,明白了,谢谢罗布斯托,你的提示#2是灵感,但是我不得不使用鼠标向下的监听器--选择事件太晚了。
在下面的示例中,我使用了来自我的some other question的代码。
此示例仅允许拖动列表或DataGrid中的第一项:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" minWidth="955" minHeight="600">
<mx:List id="list" dataProvider="{['Tom','Jerry', 'Amy', 'Betty', 'Chris', 'Dean', 'Email', 'Floyd', 'Grant', 'Helen', 'Iris', 'Jack']}" minWidth="200"
mouseDown="onMouseDown(event)"
/>
<mx:DataGrid id="dg" dataProvider="{[{title:'Tom'},{title:'Jerry'}]}" minWidth="200"
mouseDown="onMouseDown(event)"
>
<mx:columns>
<mx:DataGridColumn dataField="title" />
</mx:columns>
</mx:DataGrid>
<mx:Script>
<![CDATA[
import mx.controls.listClasses.ListBase;
import mx.events.DragEvent;
protected function onMouseDown(event:MouseEvent):void
{
var listBaseComp:ListBase = ListBase(event.currentTarget);
var clickIndex:int = this.findClickedItemIndex(event.stageX, event.stageY, listBaseComp);
listBaseComp.dragEnabled = clickIndex == 0;
}
/**
* Returns a dataProvider item that displays at the given coords for the given dataGrid.
* Code provided by Stackoverflow user https://stackoverflow.com/users/165297/amarghosh,
* thanks a lot!
*/
protected function findClickedItemIndex(globalX:Number, globalY:Number, listComp:ListBase):int
{
var p1 : Point;
var p2 : Point;
var renderer : DisplayObject;
for(var i:int=0; i<listComp.dataProvider.length; i++) {
renderer = DisplayObject(listComp.indexToItemRenderer(i));
if (!renderer) //item is not displayed (scroll to view it)
continue;
p1 = new Point(renderer.x, renderer.y);
p2 = new Point(renderer.width, renderer.height);
p1 = renderer.parent.localToGlobal(p1);
p2 = renderer.localToGlobal(p2);
if(globalX >= p1.x && globalX <= p2.x && globalY >= p1.y && globalY <= p2.y)
return i;
}
return -1;
}
]]>
</mx:Script>
</mx:Application>
发布于 2011-09-22 15:53:25
如果您想要的是避免拖动项目,则应该使用如下所示:
<fx:Script>
<![CDATA[
private function onDragStart(event:DragEvent):void {
var selectedNode:Object = itemsList.selectedItem;
if (selectedNode is not a draggable item) {
event.stopImmediatePropagation();
}
}
]]>
</fx:Script>
<s:List id="itemsList" dragStart="onDragStart(event)"/>
当拖动开始时,DragStart事件就会被分派出去,所以如果您停止了事件的传播,那么就避免了项目被拖放。
发布于 2010-03-22 16:57:24
你可以做两件事:
https://stackoverflow.com/questions/2493878
复制相似问题