Olá rramires, O problema ocorre porque o header (estranhamente) é considerado uma linha no DataGrid. Desta forma, quando você tenta arrastar uma coluna, o DataGrid tenta arrastar a "Linha Header" para uma outra posição, o que gera um erro em tempo de execução pois o objeto que está sendo arrastando é do tipo DataGridColumn e não do mesmo tipo das "Linhas de Verdade" do DataGrid. Para resolver este problema é preciso cancelar o tratamento Default dos eventos de Drag do DataGrid caso o elemento arrastado seja do tipo DataGridColumn (Linha Header).
Não sei se consegui explicar o problema, mas a solução está no código abaixo. <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"> <mx:Script> <![CDATA[ import mx.managers.DragManager; import mx.controls.dataGridClasses.DataGridColumn; import mx.events.DragEvent; import mx.collections.ArrayCollection; [Bindable] private var campos:ArrayCollection = new ArrayCollection ([ {campo: "nome", tipo: "varchar 32"}, {campo: "email", tipo: "varchar 32"}, {campo: "telefone", tipo:"varchar 22"} ]); [Bindable] private var camposSel:ArrayCollection; // funcao p/ devolver o item para o primeiro datagrid quando clicado na imagem public function devolveItem():void { campos.addItem({campo:camposS_dg.selectedItem.campo, tipo:camposS_dg.selectedItem.tipo}); camposS_dg.dataProvider.removeItemAt(camposS_dg.selectedIndex); } private function preventDragHeader(event:DragEvent):void { var items:Array=event.dragSource.dataForFormat("items") as Array; for each (var item:Object in items) { if (item is DataGridColumn) { event.currentTarget.hideDropFeedback(event); event.preventDefault(); } } } ]]> </mx:Script> <mx:DataGrid id="camposD_dg" width="240" height="140" draggableColumns="false" sortableColumns="false" dragMoveEnabled="true" allowMultipleSelection="true" dragEnabled="true" dropEnabled="true" dataProvider="{campos}" dragDrop="preventDragHeader(event)" dragComplete="preventDragHeader(event)"> <mx:columns> <mx:DataGridColumn headerText="Campos disponíveis" dataField="campo"/> <mx:DataGridColumn headerText="Tipo" dataField="tipo" width="80" textAlign="right"/> </mx:columns> </mx:DataGrid> <mx:DataGrid id="camposS_dg" width="256" height="140" draggableColumns="false" sortableColumns="false" dragMoveEnabled="true" allowMultipleSelection="true" dragEnabled="true" dropEnabled="true" dataProvider="{camposSel}" dragDrop="preventDragHeader(event)" dragComplete="preventDragHeader(event)"> <mx:columns> <mx:DataGridColumn headerText="Campos selecionados" dataField="campo"/> <mx:DataGridColumn headerText="Tipo" dataField="tipo" width="80" textAlign="right"/> <mx:DataGridColumn headerText="" width="16"> <mx:itemRenderer> <mx:Component> <mx:LinkButton label="x" click="outerDocument.devolveItem()"/> </mx:Component> </mx:itemRenderer> </mx:DataGridColumn> </mx:columns> </mx:DataGrid> </mx:Application> []'s Beck Novaes On 22 maio, 13:57, rramires <[EMAIL PROTECTED]> wrote: > To desenvolvendo um sistema e em uma das telas tem 2 datagrids, já > está funcionando tudo do jeitinho que eu quero, porém se eu mudo a > propriedade draggableColumns para false como eu preciso, ele parece > ter um bug que permite que se eu clicar no titulo das colunas (Campos > selecionados e Tipo) e arrastar para dentro do datagrid abre aquela > jenelinha de erro do player dizendo: > > Error: Cannot remove when current is beforeFirst or afterLast. > at ::ListCollectionViewCursor/remove() > at mx.controls.listClasses::ListBase/ > mx.controls.listClasses:ListBase::dragCompleteHandler() > at flash.events::EventDispatcher/ > flash.events:EventDispatcher::dispatchEventFunction() > at flash.events::EventDispatcher/dispatchEvent()[C:\Documents and > Settings\acrorel\Local Settings\Temp\aslibc-26332\EventDispatcher.as: > 184] > at mx.core::UIComponent/dispatchEvent() > at mx.managers.dragClasses::DragProxy/mouseUpHandler() > > Ele também fica doidinho e permite eu arrastar o titulo das colunas de > um datagrid para outro. > > Alguam já teve problemas com isso ??? > > Será um bug ou eu q to fazendo besteira ? > > Código (tente arrastar o titulo do datagrid pra dentro dele ou do > outro): > > <?xml version="1.0" encoding="utf-8"?> > <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" > layout="vertical"> > > <mx:Script> > <![CDATA[ > import mx.collections.ArrayCollection; > [Bindable] private var campos:ArrayCollection = > new ArrayCollection([{campo: "nome", tipo: "varchar > 32"}, > {campo: "email", tipo: "varchar 32"}, {campo: > "telefone", tipo: > "varchar 22"}]); > > [Bindable] private var camposSel:ArrayCollection; > > // funcao p/ devolver o item para o primeiro datagrid > quando > clicado na imagem > public function devolveItem():void > { > campos.addItem({campo: > camposS_dg.selectedItem.campo, tipo: > camposS_dg.selectedItem.tipo}); > > camposS_dg.dataProvider.removeItemAt(camposS_dg.selectedIndex); > } > ]]> > </mx:Script> > > <mx:DataGrid id="camposD_dg" dataProvider="{campos}" > draggableColumns="false" sortableColumns="false" > dragMoveEnabled="true" allowMultipleSelection="true" > dragEnabled="true" dropEnabled="true" > width="240" height="140"> > <mx:columns> > <mx:DataGridColumn headerText="Campos disponíveis" > dataField="campo"/> > <mx:DataGridColumn headerText="Tipo" dataField="tipo" > width="80" > textAlign="right"/> > </mx:columns> > </mx:DataGrid> > <mx:DataGrid id="camposS_dg" dataProvider="{camposSel}" > draggableColumns="false" sortableColumns="false" > dragMoveEnabled="true" allowMultipleSelection="true" > dragEnabled="true" dropEnabled="true" > width="256" height="140" > > <mx:columns> > <mx:DataGridColumn headerText="Campos selecionados" > dataField="campo"/> > <mx:DataGridColumn headerText="Tipo" dataField="tipo" > width="80" > textAlign="right"/> > <mx:DataGridColumn headerText="" width="16"> > <mx:itemRenderer> > <mx:Component> > <mx:Image > click="parentDocument.devolveItem()" > source="@Embed('assets/delete.png')" /> > </mx:Component> > </mx:itemRenderer> > </mx:DataGridColumn> > </mx:columns> > </mx:DataGrid> > > </mx:Application> --~--~---------~--~----~------------~-------~--~----~ Você recebeu esta mensagem porque está inscrito na lista "flexdev" Para enviar uma mensagem, envie um e-mail para [email protected] Para sair da lista, envie um email em branco para [EMAIL PROTECTED] Mais opções estão disponíveis em http://groups.google.com/group/flexdev -~----------~----~----~----~------~----~------~--~---
