Selecionando um item em um ComboBox II

Há um tempo atrás eu escrevi um artigo sobre como selecionar um item em um ComboBox no Flex baseado no label do combo. Naquela época, eu ainda estava aprendendo algumas coisas. Como eu já aprendi um pouco, resolvi fazer uma versão mais decente daquele exemplo.

Essa aplicação faz exatamente a mesma coisa: tem um combo com uma relação de frutas e um botão que, ao ser clicado, deverá selecionar no combo o item cujo label é “Uva”. Coisa simples.

Vamos lá. Primeira diferença em relação ao outro exemplo: a relação de frutas está um um XML, e não em um array. Aqui está a definição do nosso XML:


[Bindable]
private var frutasProvider:XML = <frutas>
<fruta>
	<nome>Laranja</nome>
	<preco>5</preco>
</fruta>
<fruta>
	<nome>Uva</nome>
	<preco>3</preco>
</fruta>
<fruta>
	<nome>Melancia</nome>
	<preco>8</preco>
</fruta>
<fruta>
	<nome>Pêra</nome>
	<preco>10</preco>
</fruta>
</frutas>

Nosso XML tem de ser [Bindable], pois ele será o dataProvider do nosso combo. E por falar nisso, aqui está ele, junto com o botão:

<mx:ComboBox id="cboFrutas" x="10" y="40" dataProvider="{frutasProvider.fruta}" labelField="nome" prompt="Selecione..." width="146"></mx:ComboBox>
<mx:Button x="31.5" y="10" label="Selcionar Uva" click="selecionarUvaClickHandler(event)"/>

Até aqui, nada novo: o dataProvider do combo é o XML, e o campo do XML que tem o label do combo (labelField) é o campo “nome”. A propriedade prompt tem o texto que aparecerá no combo enquanto nenhum item está selecionado. E o botão não tem nada especial, só uma chamada para a função a seguir no evento “click”:

private function selecionarUvaClickHandler(event:MouseEvent):void
{
	cboFrutas.selectedItem = frutasProvider.fruta.(nome == "Uva");
}

Aqui é que está o “truque”: ao invés de ter que ficar iterando entre os itens do dataProvider, podemos deixar que o E4X faça isso por nós. O que essa linha quer dizer é que o item selecionado do combobox (cboFrutas.selectedItem) é igual ao objeto <fruta> que está no XML, e que tenha a propriedade <nome> igual a “Uva”.

Isso é possível porque o E4X (Ecma for XML) dispõe de uma variedade de métodos para facilitar a vida do programador nessas tarefas braçais. Para mais informações sobre o E4X, consulte a documentação. Veja o exemplo funcionando:

Ficou muito mais rápido, fácil e elegante selecionar um item em um combo, não?!


Poderia avaliar este artigo, por favor?

1 Estrela2 Estrelas3 Estrelas4 Estrelas5 Estrelas
Loading ... Loading ...

Posts relacionados

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

  • http://www.queroveiculos.com.br/ carro

    Cara, que dica maneira, nunca imaginei esse operador, vou estudar melhor o link.

    Obrigado pela dica.

  • http://www.queroveiculos.com.br/ carro

    Cara, que dica maneira, nunca imaginei esse operador, vou estudar melhor o link.

    Obrigado pela dica.

  • Roberto

    Muito legal, mas e se o meu dataprovider não puder ser uma xml e sim um arraycollection mesmo, dá pra conveter ou tem outro truque?
    Abraço!

  • Roberto

    Muito legal, mas e se o meu dataprovider não puder ser uma xml e sim um arraycollection mesmo, dá pra conveter ou tem outro truque?
    Abraço!

  • Marcelo

    Cara eu estou com uma duvida cruel. Como faco para que um dado de uma combo defina os dados de uma segunda combo. Tipo assim, vc tem varios uf(rio,saopaulo,bh e etc) quando eu seleciono rio por exemplo a segunda combo preenche as cidades daquela uf selecionada. Sendo que os dados estao vendo do banco. Os exemplos que vi todos usam xml. E nao serve para mim.. vc tem uma ideia de como faz isso?

  • Marcelo

    Cara eu estou com uma duvida cruel. Como faco para que um dado de uma combo defina os dados de uma segunda combo. Tipo assim, vc tem varios uf(rio,saopaulo,bh e etc) quando eu seleciono rio por exemplo a segunda combo preenche as cidades daquela uf selecionada. Sendo que os dados estao vendo do banco. Os exemplos que vi todos usam xml. E nao serve para mim.. vc tem uma ideia de como faz isso?

  • Pingback: Combobox « Bruno bg + ADOBE FLEX