Bha, esta noite estou inspirado. Então aqui vai mais um exemplo de como utilizar eventos dentro de itemRenderer de um DataGrid.

No exemplo coloquei um botão de editar dentro de uma coluna do DataGrid, e quando clicar, preciso que abra um PopUp para edição dos dados.

Arquivo main.mxml
<mx:DataGrid id="dgFiltro" dataProvider="{XMLdatagrid}" left="10" right="10" top="10" bottom="10">
    <mx:columns>
        <mx:DataGridColumn width="70" editable="false">
            <mx:itemRenderer>
                <mx:Component>
                    <mx:HBox horizontalAlign="center">
                        <mx:Button height="100%" label="Editar"
                                   click="dispatchEvent(new Event('editar', true))" />
                    </mx:HBox>
                </mx:Component>
            </mx:itemRenderer>
        </mx:DataGridColumn>
        <mx:DataGridColumn headerText="Nome" dataField="name" />
        <mx:DataGridColumn headerText="Telefone" dataField="phone" />
        <mx:DataGridColumn headerText="E-mail" dataField="email" />
    </mx:columns>
</mx:DataGrid>

Veja acima que ao clicar no botão editar dentro do itemRenderer, é dispachado um evento. Com um evento sendo disparado, preciso de um que este seja escutado, então no creationComplete é iniciado a escuta do evento.

Arquivo main.mxml
private function init():void
{
    dgFiltro.addEventListener("editar", editar);
}

Posso adicionar quantos eventos for necessário ao DataGrid.

Ao ser dispachado o Evento é enviado para a função editar(e:Event) que abre o PopUp.

Arquivo main.mxml
public function editar(e:Event):void
{
    var abrir:IFlexDisplayObject = Editar.abrirPOPUP(dgFiltro.selectedItem);
}

Agora é se divertir com o Fonte.

Gostou? Não esqueça de curtir!

Ou compartilhe o link com seus amigos

Compartilhar no Facebook Compartilhar no Google + Compartilhar no Twitter Compartilhar no LinkedIn

21 comentários

  1. Karoline

    Parabéns pelo blog.

    Aproveitando esse tópico, vc sabe como eu passo um valor do datagrid, como vc fez neste exemplo, só que para uma tab? Tipo, dou um duplo click no registro no datagri e é aberto uma tab passando este parametro.

    No caso estou usando a lib SuperTabNavigator.

    Grata

    Karol

  2. julio carneiro

    só um comentário que vc pode obter o mesmo resultado executando: Editar.abrirPOPUP(dgFiltro.selectedItem);
    direto no click to botão.

    Assim vc elimina um evento adicional.

    Grande blog btw.
    julio

  3. Ulisses Tavares

    E como eu faço para que o grid inicial seja atualizado com as alterações feitas no Editar?

    Parabéns pelo blog!

  4. Cristiane

    Estou com a mesma dúvida... alguem pode me ajudar??

  5. César

    Parabéns pelo blog.

    Aproveitando o  tópico e a idéia da Karol,  vc sabe como eu passo um valor do datagrid, como vc fez neste exemplo, só que para uma nova tela (TitleWindow)? - Abrir uma tela com os dados podendo alterar e como ter uma tela de inclusão também usando um TitleWindow.

    Venho do delphi e estou meio perdido ainda.

    Grato,

    César

  6. Marcos

    Como eu poderia popular o grid com as variáveis de ambiente do WIN/LINUX para poderem ser editadas e salvas??? Vc pode dar um caminho???
    Flw.

  7. Jackson Barcellos

    Bom Dia estou aprendendo Flex e achei o seu exemplo fantastico, porém não sei como fazer para atualizar o datagrid com a informação que alterei no pop up, você pode me dizer como faço para do POP UP acessar datagrid ou algum metodo do aplicativo que chamou o popup

  8. Alemão

    @Marcos Não há como editar variáveis de ambiente através do Flex

  9. Iron Man

    Para aqueles que queriam passar valores para outras tabs e telas....

    Eu ainda não descobri uma maneira perfeita para fazer isso, mas usei variáveis públicas, tanto para os TabsNavegators quando para as TitleWindows.

    Ou seja

    No evento de escuta, criem instanciem um objeto da tela que vocês querem , depois é só atualizar as variáveis públicas contidas dentro deles, ou usem variáveis estáticas.

    Foi o melhor que consegui por enquanto.

    Parabéns pelo blog

  10. marcelo caser

    galera, passar para uma titlewindow, tabnavegators e tranquilo segue a mesma logica... o que eu tenho duvida eh sobre como atualizar o datagrid apos uma alteracao ou algo parecido!!

  11. Alemão

    @Marcelo Simples, chame novamente a função que carrega os dados inicialmente do servidor.

  12. marcelo caser

    @Alemao,

    A questao é como fazer isso! Seguindo o exemplo acima, meu metodo "listar" esta dento do main.mxml, certo?. Entao seguindo a logica eu teria que chama-lo após o Fechar() que está em Editar.mxml certo? ou nao? Eu sei que tem que chama-lo, a questao eh como!

  13. Eduardo Kraus

    @Marcelo Veja a seguinte linha do Exemplo:

    var abrir:IFlexDisplayObject = Editar.abrirPOPUP(dgFiltro.selectedItem);

    Esta chama o popUp. Esta linha tem o evento de fechar também.
    abrir.addEventListener(CloseEvent.CLOSE, refreshNoDatagrid)

    implemente o refreshNoDatagrid para recarregar os dados no DataGrid.

  14. marcelo caser

    @Eduardo

    A ideia é boa, porem ainda nao atende. Estou chamando o abrir.addEventListener(CloseEvent.CLOSE, empresasList.getEmpresas()) apos var abrir:IFlexDisplayObject = Editar.abrirPOPUP(dgFiltro.selectedItem);
    porém, o evento só acontece, atualizando o datagrid quando eu clico em "Editar",

    gostaria que atualiza-se, seguindo o exemplo acima, após eu clicar no botão OK do alert, por exemplo, como vc vez do seu exemplo.

  15. marcelo caser

    @Eduardo

    Deu certo kra... a questao é o que vc falou mesmo.. o erro que estava dando era baianada, ficou assim:

    abrir.addEventListener(Event.CLOSE, listarEmpresas);

    ae na janela que abre eu faço, dentro do metodo "salvar"

    this.dispatchEvent(new CloseEvent(CloseEvent.CLOSE));

    vlw...obrigado!

  16. paulo neto

    Codigo bastante eficiente me ajudou bastante, muito obrigado.

  17. Eduardo Kraus

    @Paulo Obrigado pelo Comentário

  18. Douglas

    Não consigo adicionar o evento:

    DG_Item.addEventListener("editar", editar);
    da erro:
    Não é possível acessar uma propriedade ou um método de uma referência de objeto nula.

  19. Eduardo Kraus

    Ola @Douglas

    O DG_Item existe? A função editar existe?

  20. Douglas

    Existe sim, havia colocado no init(), ae dava eferência de objeto nula,

    então coloquei na exibição do meu canvas_dasdos no Tabnavaigator no evento Show, ae deu certo,
    muito obrigado.

Deixe uma resposta