Selecionando um item em um ComboBox no Flex

Uma funcionalidade que eu senti falta (e que causou muita dificuldade) quando comecei a programar em Flex foi no uso do ComboBox. Eu precisava selecionar um determinado item em uma lista baseado no seu label. Fiquei frustrado ao descobrir que a propriedade selectedLabel era read-only (somente leitura)! Seria a solução dos meus problemas.

Cheguei a encontrar artigos que propunham a criação de um novo componente, só para implementar essa funcionalidade. Obviamente, como estava começando, só tentei criar o tal componente, sem sucesso.

Esses dias me deparei com a mesma necessidade, e como a gente vai aprendendo uns “caminhos alternativos” através da experiência, cheguei a uma alternativa: criar um loop que procure no dataProvider do ComboBox o Label desejado, e depois definir a propriedade selectedItem com o objeto vindo do loop.

Calma, vou explicar melhor, usando um exemplo. Considere o trecho de código a seguir:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute" width="221" height="124">
  <mx:Script>
    <![CDATA[
      [Bindable]
      private var frutas:Array = new Array(
        {data:1, label:"Laranja"},
        {data:2, label:"Melancia"},
        {data:3, label:"Uva"},
        {data:4, label:"Banana"},
        {data:5, label:"Melão"}
      );
    ]]>
  </mx:Script>

  <mx:ComboBox id="combo" x="40.5" y="76"
    dataProvider="{frutas}" width="144">
  </mx:ComboBox>
  <mx:Button x="80" y="27" label="Uva"/>
</mx:Application>

O resultado é o seguinte:

ComboBox e um Botão

A idéia é que, após clica no botão “Uva”, o item correspondente seja selecionado no combo.

Esse exemplo bem simples é uma situação muito comum de encontrar, principalmente em aplicações onde o usuário grava no banco alguma informação selecionada nestes combos.

Bom, até aqui o programa não faz nada de útil, mas vamos acrescentar algumas funções. Primeiro, quando o botão for clicado, ele definir o Item que será selecionado no Combo. Alteramos a definição do nosso botão:

<mx:Button x="80" y="27" label="Uva"
  click="{combo.selectedItem = selecionarItem('Uva')}"/>

E criamos a função que vai retornar o Objeto que deve ser selecionado:

private function selecionarItem ( fruta:String ):Object {
  for ( var cont:int = 0; cont < frutas.length; cont++ ) {
    if (frutas[cont]['label'] == fruta) {
      return frutas[cont];
    }
  }
  return null;
}

Pronto! Não é tão elegante quanto criar um componente customizado, mas quando se tem o acesso ao dataProvider como no exemplo citado, é uma alternativa possível.

Veja a “aplicação” funcionando.

Edit @ 17ago08

Eu escrevi um post com uma versão melhorada desse exemplo aqui.


Poderia avaliar este artigo, por favor?

1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas (Nenhum voto)
Loading ... Loading ...

Posts relacionados

  • Michel

    hum legal, e se eu quiser colocar um link
    ou fazer uma lista de links da pra retornar um link com If (Frutassite)ou (mangassite), me responde por favor preciso de uma luz ai, srsrsr
    obrigado

  • Michel

    hum legal, e se eu quiser colocar um link
    ou fazer uma lista de links da pra retornar um link com If (Frutassite)ou (mangassite), me responde por favor preciso de uma luz ai, srsrsr
    obrigado

  • Pingback: Elvis Fernandes » Blog Archive » Selecionando um item em um ComboBox II

  • http://www.elvis.eti.br/ Elvis Fernandes

    Olá, Michel!

    Não entendi muito bem a sua dúvida, mas se você quiser tomar alguma ação baseado no item selecionado no combo, coloque a sua função para ser disparada no evento change do Combo. Esse evento deve pegar a propriedade URL do objeto selecionado e a partir daí fazer o que você precisar, seja mostrar na tela ou abrir uma janela do browser com o link selecionado.

    Abraço!

    Elvis Fernandes

  • http://www.elvis.eti.br Elvis Fernandes

    Olá, Michel!

    Não entendi muito bem a sua dúvida, mas se você quiser tomar alguma ação baseado no item selecionado no combo, coloque a sua função para ser disparada no evento change do Combo. Esse evento deve pegar a propriedade URL do objeto selecionado e a partir daí fazer o que você precisar, seja mostrar na tela ou abrir uma janela do browser com o link selecionado.

    Abraço!

    Elvis Fernandes

  • Cristian

    Opa, eu não esperava fazer assim, procurei, procurei, mas acabei utilizando esta função…

    Facilitou legal :D

  • Cristian

    Opa, eu não esperava fazer assim, procurei, procurei, mas acabei utilizando esta função…

    Facilitou legal :D

  • Felipe

    meu deus q gambiarra… LOL