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
-~----------~----~----~----~------~----~------~--~---

Responder a