2


3

AdvancedDataGridツリー構造にカスタムドラッグを実装したいのですが、これはブランチ上でのドラッグのみを許可します(葉ではありません)。

私はMouseDownイベントを使用しようとしていますが、幸運ではありません。

さて、私はアイテムが葉の枝であるかどうかを把握することができるようになったと思います。 advanceddatagridを使用してカスタムドラッグを実行する方法に関するヘルプ

var grid:AdvancedDataGrid = AdvancedDataGrid(event.currentTarget); if(grid.selectedItem.hasOwnProperty( "categories")

2 Answer


1


私はこれを行うためにさまざまな方法を試してみましたが、これが私が思い付いた中で最高のソリューションです。 AdvancedDataGridには、mouseMove / mouseOver / mouseDownイベントを処理するためのロジックがすでに組み込まれているので、再作成する必要はありません。 DragEventハンドラをオーバーライドするだけです。

アイテムをドラッグできるかどうかを判断するためのロジックや、特定の場所にドロップできるかどうかを判断するためのロジックなど、同様の機能を必要とするいくつかのアプリケーションで使用したコードを複製しました。 私はまた、特定のことが行われる理由を説明するのを助けるために広範囲のコメントを含めました。 これが助けになれば幸いです。

CustomADG.as:

package {import mx.controls.AdvancedDataGrid; import mx.controls.listClasses.IListItemRenderer; mx.core.DragSourceをインポートします。 import mx.events.DragEvent; import mx.managers.DragManager; import mx.utils.ObjectUtil;

パブリッククラスDragDropADGは、AdvancedDataGridを拡張します。

パブリック関数DragDropADG(){super(); }

protected function dragStartHandler(event:DragEvent)をオーバーライドします。void {/ * selectedItemの配列から新しい配列を作成し、「枝」ではない項目を除外します。 * / var selectedBranches:オブジェクトの配列/ * * / = selectedItems.filter(hasCategories);

function hasCategories(element:*、index:int、array:Array):Boolean {/ *項目がBranch(categoriesプロパティに子を持つ)の場合、trueを返します。 * / return(element.hasOwnProperty( "categories")

/ *ブランチが選択されていない場合は終了します。 これによりドラッグ操作が開始されなくなります。 * / if(selectedBranches.length == 0)が返される。

/ * selectedItems配列をリセットして、選択したブランチのみを含めます。 これにより、「ブランチ以外」の項目はすべて選択解除されます。 * / selectedItems = selectedBranches;

/ *ドラッグプロキシで表示するためにソートする選択されたインデックスの配列のコピーを作成します。 * / var sortedSelectedIndices:配列/ * of int * / = ObjectUtil.copy(selectedIndices)は配列/ * of int * /です。

//選択したインデックスをソートするsortedSelectedIndices.sort(Array.NUMERIC);

/ *選択したブランチ項目をAdvancedDataGridに表示される順序でソートして格納するための新しい配列を作成します。 * / var draggedBranches:Array = [];

var itemRendererAtIndex:IListItemRenderer;

それぞれについて(var index:sortedSelectedIndices内のint){itemRendererAtIndex = indexToItemRenderer(index);

var branchItem:Object = itemRendererAtIndex.data;

draggedBranches.push(branchItem); }

//ドラッグ操作に関するデータを格納するための新しいDragSourceオブジェクトを作成します。 var dragSource:DragSource = new DragSource();

//ドラッグするブランチの配列をDragSourceオブジェクトに追加します。 dragSource.addData(draggedBranches、 "draggedBranches");

//ドラッグプロキシとして機能する新しいコンテナを作成します。 var dragProxy:DragProxyContainer = new DragProxyContainer();

/ *ドラッグされているアイテムの "label"フィールドを使ってドラッグプロキシのラベルを更新します。 * / dragProxy.setLabelText(draggedBranches);

/ *(DragEventの)マウスカーソルの位置からこのコンポーネントに相対的な点を作成します。 * / var eventPoint:Point = new Point(event.localX、event.localY);

//ドラッグイベントDragManager.doDrag(this、dragSource、event、dragProxy、-eventPoint.x、-eventPoint.y、0.8); }

/ *この項目は、他のコンポーネントからの項目であっても、任意の項目がこのAdvancedDataGridの任意の部分にドラッグされたときに実行されます。 * /保護された関数を上書きするdragEnterHandler(event:DragEvent):void {/ *ドラッグされている項目がドラッグされたブランチを含まない、または含まない場合、別のコンポーネントからドラッグされます。ドロップが発生しないようにするには、関数を終了してください。 * / if(!event.dragSource.hasFormat( "draggedBranches"))return;

var dropIndex:int = calculateDropIndex(event);

/ *現在のドラッグターゲットのitemRendererを取得して、ドラッグターゲットがドロップを受け入れることができるかどうかを判断します。 * / var dropTargetItemRenderer:IListItemRenderer = indexToItemRenderer(dropIndex);

/ * itemRendererがない場所にアイテムがドラッグされている場合は、ドロップが発生しないようにするために関数を終了します。 * / if(dropTargetItemRenderer == null)

/ *アイテムがデータなしでitemRendererにドラッグされている場合は、ドロップが発生しないように関数を終了します。 * / if(dropTargetItemRenderer.data == null)

/ *ドラッグされているitemRendererの基になる項目を格納して、そこにドロップできることを確認します。 * / var dragEnterItem:Object = dropTargetItemRenderer.data

if(!dragEnterItem.hasOwnProperty( "categories")を返します。

if(dragEnterItem.categories == null)を返します。

var eventDragSource:DragSource = event.dragSource;

eventDragSource.addData(dragEnterItem、 "dropTargetItem");

/ * dragDropイベントリスナーをitemRendererに追加して、ドロップされたときに必要になるようにします。

//ドラッグされているitemRendererがドロップを受け付けることができることを指定します。 DragManager.acceptDragDrop(dropTargetItemRenderer); }

/ *ユーザーがアイテムをドロップした後に発生したいロジックを実行します。 プライベート関数itemRenderer_dragDropHandler(event:DragEvent):void {var

var dropTargetItem:Object = eventDragSource.dataForFormat( "dropTargetItem");

if(dropTargetItem == null)を返します。

var draggedBranchesData:Object = eventDragSource.dataForFormat( "draggedBranches");

var draggedBranches:Array / * of Object * / = draggedBranchesDataはArray / * of Object * /;

//基本データなどを更新するために他の関数を呼び出します。 }}}

DragProxyContainer.as:

package {import mx.containers.VBox; import mx.core.UITextField;

[バインド可能]パブリッククラスDragProxyContainerはVBoxを拡張します{private var textField:UITextField = new UITextField();

パブリック関数DragProxyContainer(){super();

minWidth = 150。

addChild(textField); }

パブリック関数setLabelText(items:Array、labelField:String = "label"):void {var labelText:String;

var numItems:int = items.length;

if(numItems> 1){labelText = numItems.toString() "items"; } else {var firstItem:Object = items [0];}

labelText = firstItem [labelField]; }

textField.text = labelText; }}}


0


オブジェクトがリーフの場合、 `+ dragEnter()+`イベントを処理してドラッグを停止できます。