Uma coisa que vocês tem que ter noção é que o grid, ou qualquer outro
componente de lista do Flex NÃO POSSUEM ITENS NEM LINHAS!

Ele simplesmente apresenta os dados providos na propriedade dataProvider.

Portanto, o que você quer fazer é simplesmente copiar um elemento do array
para outra posição.

Mas aí temos as pegadinhas. Rá! =)

Arrays, por padrão, são imutáveis, ou seja, não é nada bom adicionar itens
neles (já que eles alocam um espaço em memória com apenas um ponteiro e
adicionar um item nestes caras implica, implicita ou explicitamente, em
copiar todo o array antigo para uma nova localização na memória + o item a
ser inserido).

Por isso a grande maioria das operações feitas em listas no Flex são através
do ArrayCollection, que são listas de dados onde novos dados podem ser
adicionados mais facilmente (e há mecanismos internos para prover
performance a esta operação).

O grande problema é que cada item do ArrayCollection é um objeto. E o que é
um objeto? Apenas um inteiro apontando para uma estrutura da memória. Então
copiar o objeto para outra posição do array na verdade não o copia, apenas
copia sua referência (o que implica que uma alteração no item original seja
imediatamente replicada para os itens copiados já que eles são a mesma
coisa, a mesma estrutura em memória).

Para isso o ActionScript define uma interface para adicionar o método Clone
em um objeto. Cabe a você, programador, implementar o mecanismo de clone na
sua classe que implica, basicamente, em criar uma nova instância do tipo
desejado e copiar cada uma das propriedades para esta nova instância,
gerando assim uma cópia real do objeto.

Então, vamos supor sua classe:

public class MinhaClasse
{
  public var nome:String;
  public var idade:int;
}

Ficaria assim:

public class MinhaClasse
{
  public var nome:String;
  public var idade:int;

  public function clone():MinhaClasse
  {
    var copia:MinhaClasse = new MinhaClasse();

    copia.nome = this.nome;
    copia.idade = this.idade;
    return copia;
  }
}

Aí no teu grid, você poderia fazer:

(grid.dataProvider as ArrayCollection).addItem(itemADuplicar.clone());

E, pronto, você tem um item duplicado na sua estrutura de dados.

Note, obviamente, que se sua classe tiver um atributo/propriedade que seja
não primitivo, você deverá clonar este elemento também, ou seja, supondo que
NOME seja uma classe sua composta pelos campos nome e sobrenome. Não
adiantaria fazer copia.nome = this.nome porque, novamente, você estaria
apenas duplicando o ponteiro. Neste caso o mesmo esquema deveria ser
adotado: copia.nome = this.nome.clone();



2010/1/22 Lorenzi <[email protected]>

> Boa tarde.
>
> Seguinte minha duvida é essa tenho um  datagrid com tres colunas nome,
> idade, duplicar(este sera um botao para o cara clicar) . Minha duvida
> é como eu faço para clicar no duplicar e ele criar uma nova linha no
> grid, copiando a linha clicada.
>
>
> /*normal*/
> Nome            idade      Duplicar
> Marcelo           23            +
>
> /*duplicado*/
> Nome            idade      Duplicar
> Marcelo           23            +
> Marcelo           23            +
>
> /*duplicado*/
> Nome            idade      Duplicar
> Marcelo           23            +
> Marcelo           23            +
> Marcelo           23            +
>
> desta maneira.
>
> Grato.
>
> --
> 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




-- 
[]
Júlio César Ködel G.

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