Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Matheus Brito

[Resolvido]Problema com ItemRender

Recommended Posts

Pessoal, é o seguinte, faço uma consulta no banco depois jogo esse resultado num arraycollection, dai seto como dataProvider de um dataGrid, ai no grid coloquei um itemRender , com checkBox's, ou seja para cada registro é criado um checkBox, ate ai ok. Problema que quando escolho um checkBox e faço a rolagem no grid meus checkboxes ficam randomicos, aparecem marcados os que não marquei e os que marquei aparecem desmarcados. Dei uma lida por ai e descobrir que tenho que sobrescrever o metodo set data, mas ainda não consegui fazer com que fiquem funcionando nao.

 

Alguém pode me ajudar???

 

eder força ai meu fiiii.

 

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

hahhahaa, ta achando que vai receber tratamento especial só pq é moderador? :P

 

 

 

mas ok, esse problema do flex é bem comum mesmo, já vi solução com override

na classe checkBox como você disse, mas um que eu já usei, é assim:

 

destaquei as propriedades que você deve setar:

 

 

<mx:DataGrid editable="true">

<mx:DataGridColumn headerText="marcado" rendererIsEditor="true" editorDataField="estamarcado">

<mx:itemRenderer>

<mx:Component>

<mx:CheckBox selected="{data.estamarcado}"/>

</mx:Component>

</mx:itemRenderer>

</mx:DataGridColumn>

</mx:DataGrid>

 

 

no caso, o campo "estamarcado" é o campo do seu arraycollection com o valor que

vai no CheckBox

 

outra coisa é que todas as colunas do grid estão como editáveis, caso não queria assim, marque cada uma das outras DataGridColumn como editable="false"

 

 

acho que é isso

 

 

[]´s

 

 

ps: 4.000!!!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

hahahahahahahahahaha

Eder queria uma molezinha sim.... rsrsrsrs

 

 

Seguinte acredito que desse modo que voce mostrou funcionaria, porem meu dataProvider nao tem nenhum parametro como você colocou ali de estamarcado... Meu dataprovider simplesmente é uma consulta de select * from convenios order by ConvenioNome;

 

dai jogo no arraycollection e pronto.Tanto que meu dataGrid com o itemrender ta assim:

 

<mx:DataGrid id="convenios" change="conveniosSelecionados(event)" x="0" y="33" width="353" height="115" dataProvider="{dpGridConvenio}" editable="true">
	<mx:columns>
			
	<mx:DataGridColumn headerText="Id" dataField="ConvenioId" width="30" editable="false" />
	<mx:DataGridColumn headerText="Convênio" dataField="ConvenioNome" editable="false" />
        <mx:DataGridColumn headerText="#" width="22" itemRenderer="br.com.matheus.itemRenders.Item01" editable="true" rendererIsEditor="true" editorDataField=""/>
					
			</mx:columns>
		</mx:DataGrid>

 

Ou seja eu não tenho parametros no dataProvider pra fazer do jeito que você falou, tanto que eu criei uma coluna a mais no grid so pra ter os checkboxes, tanto que nem dataField tem.

 

 

 

 

 

Abs

 

 

P.S Um dia chego lá

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesse caso é mais fácil, você tem que definir um um nome para a coluna do dataProvider,

se não, ele não sabe onde guardar o valor

 

 

faça isso:

 

<mx:DataGridColumn headerText="#" width="22" itemRenderer="br.com.matheus.itemRenders.Item01" editable="true" click="data.ativo=!data.ativo" selected="{data.ativo}" />

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

nesse caso é mais fácil, você tem que definir um um nome para a coluna do dataProvider,

se não, ele não sabe onde guardar o valor

 

 

faça isso:

 

<mx:DataGridColumn headerText="#" width="22" itemRenderer="br.com.matheus.itemRenders.Item01" editable="true" click="data.ativo=!data.ativo" selected="{data.ativo}" />

 

 

[]´s

 

 

Ow eder meu item render é externo como você pode ver pelo package br.com.matheus.ItemRender.Item01, dai fiz como você falou coloquei o atributo click e o atributo selected no componete Item01, funcionou ele consegue manter o estado dos checkboxes, não mexi em nada do dataProvider. Agora como eu recupero os checkboxes que foram marcados? Tenho que percorrer o grid? ou existe uma forma mais fácil?

 

Abs e vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

não seria no grid, e sim no dataProvider do grid (é lá que estão os dados)

 

como eu falei, você definiu um nome para a coluna onde tem esses dados do checkbox

 

então você precisaria sim percorrer ele, tipo um array,

 

para pegar o valor do primeiro item seria:

 

trace(convenios.dataProvider[0].ativo)

 

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

não seria no grid, e sim no dataProvider do grid (é lá que estão os dados)

 

como eu falei, você definiu um nome para a coluna onde tem esses dados do checkbox

 

então você precisaria sim percorrer ele, tipo um array,

 

para pegar o valor do primeiro item seria:

 

trace(convenios.dataProvider[0].ativo)

 

 

 

[]´s

 

 

Vamos lá:

 

1- Mudei o itemRender pra inline, ficou assim:

 


<mx:DataGrid id="convenios" change="conveniosSelecionados(event)" x="0" y="33" width="353" height="115" dataProvider="{dpGridConvenio}" editable="true">
		               <mx:columns>
			
				<mx:DataGridColumn headerText="Id" dataField="ConvenioId" width="30" editable="false" />
				<mx:DataGridColumn headerText="Convênio" dataField="ConvenioNome" editable="false" />
				<mx:DataGridColumn headerText="#" width="22" editable="true" rendererIsEditor="true">
					<mx:itemRenderer>
						<mx:Component>
							<mx:CheckBox click="data.ativo=!data.ativo" selected="{data.ativo}"  />
						</mx:Component>
					</mx:itemRenderer>
				</mx:DataGridColumn>
			</mx:columns>
		</mx:DataGrid>

 

2- Beleza tenho que recuperar percorrendo o vetor mas qual evento eu uso pra tipo depois que o cara selecionar os checkboxes, eu fazer a varredura?

 

Tentei algo assim, mas a lógica pode estar meio certa mas não funciona direito:

 


//Coloquei um evento change no dataGrid e nesse evento eu testo se o cara escolheu o checkboxes
if(convenios.dataProvider[0].ativo ==true){ 
//Se for verdade eu insiro esse check num vetor.
}

 

Só que tem um problema, if(convenios.dataProvider[0].ativo ==true) essa linha testa apenas a posicao[0] do dataProvider, problema que se eu tirar nao funciona nada, tipo testei dando Alert e não saiu nada.

O teste foi feito assim, isso dentro do evento change do dataGrid.

 

 


if(convenios.dataProvider.ativo == true){
  Alert.show(convenios.dataProvider.ativo);
}

 

Sinceramente não sei como resolver isso, to penando nisso já tem tempo, vo precisar comprar bons livros de flex.

 

Abs e vlw pela ajuda.

Compartilhar este post


Link para o post
Compartilhar em outros sites

normal isso, eu emperro direto em alguns pontos ^_^ , dá até raiva pois parece simples

 

mas sobre o dataProvider, ele é um tipo de array (collections)

 

então se você fizer:

 

alert.show(convenios.dataProvider.length);

vai mostrar quantas linhas tem o seu dataGrid,

 

com esse numero você pode percorrer ele com um FOR

 

 

testa ai

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Hum eu já tinha pensado nisso mas pensei de forma equivocada.

Irei codificar isso ai, e volto com o resultado.

Mas to com outra duvida, deixa eu implementar isso, depois te mostro.

Abs e vlw

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh eder a coia ta feia o itemrender parece que ta ok, mas não to conseguindo inserir no banco, realmente eu preciso de livros de flex me indica alguns ai... ou alguma coisa que me ajude principalmente nos relacionamentos muitos pra muitos.

 

Segue código:

 


private function adicionarPacientes(e:MouseEvent):void{
				remote.inserirPacientes.send();
				var total:uint = convenios.dataProvider.length;
				for(var i:uint = 0;i<total;i++){
					if(convenios.dataProvider[i].ativo == true){
						[b]remoteConvenioPaciente.inserirConvenioPaciente(
							 convenios.dataProvider[i].ConvenioId,
							 idUltimoPaciente,
							"sim"
							);[/b]
					
					}
				}
				limparCampos();
				}

 

Posso chamar um metodo dessa maneira? Porque geralmente ou chama usando o mxml, ou usando VO, mas me atrapalhei com VO nos relacionamentos e to me atrapalhando aqui tb. Problema que se eu chamar com mxml não tenho como passar parametros diferentes como é o caso do muitos pra muitos.

 

 

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre livros, um que eu não comprei(ainda!) é o Adobe Flex 3 Treinamento Direto da Fonte,

já me indicaram ele, deve ser bom

 

 

 

 

não vi nada errado com o codigo, você pode chamar assim como esta

 

if(convenios.dataProvider[i].ativo == true){
       remoteConvenioPaciente.inserirConvenioPaciente(
                                                         convenios.dataProvider[i].ConvenioId,
                                                         idUltimoPaciente,
                                                        "sim"
                                                        );
                                        
}

com VO, mudaria pouca coisa, mas como e padrão utilizar, ficaria assim:

 

 

if(convenios.dataProvider[i].ativo == true){
       var pasciVO:PacienteVO = new PacienteVO(convenios.dataProvider[i].ConvenioId, idUltimoPaciente, "sim")
       remoteConvenioPaciente.inserirConvenioPaciente(pasciVO);
                                        
}

 

por acaso os dados não estão sendo enviados?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sobre livros, um que eu não comprei(ainda!) é o Adobe Flex 3 Treinamento Direto da Fonte,

já me indicaram ele, deve ser bom

 

 

 

 

não vi nada errado com o codigo, você pode chamar assim como esta

 

if(convenios.dataProvider[i].ativo == true){
       remoteConvenioPaciente.inserirConvenioPaciente(
                                                         convenios.dataProvider[i].ConvenioId,
                                                         idUltimoPaciente,
                                                        "sim"
                                                        );
                                        
}

com VO, mudaria pouca coisa, mas como e padrão utilizar, ficaria assim:

 

 

if(convenios.dataProvider[i].ativo == true){
       var pasciVO:PacienteVO = new PacienteVO(convenios.dataProvider[i].ConvenioId, idUltimoPaciente, "sim")
       remoteConvenioPaciente.inserirConvenioPaciente(pasciVO);
                                        
}

 

por acaso os dados não estão sendo enviados?

 

 

Assim que eu termino de preencher o cadastro eu insiro o paciente na tabela de paciente, dai retorno o id desse cara, e recupero esse valor no flex, porem o valor não está vindo, fica o buscursor o tempo todo.

 

No browser do amfphp o metodo esta correto e retorna certinho tb.Dai quando eu faço remotePaciente.inserirPacientes.send() o result desse metodo ta assim:


public function funcao(e:ResultEvent):void{

  idUltimoPaciente = uint(e.result);
}
//Dai chamo essa variavel idUltimoPaciente, no metodo que mostrei anteriormente.Mas nao esta correto ta vindo 0, e eu ja chamei o metodo de inserir so o paciente primeiro então não tem porque esta  vindo errado.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

difícil eu ajudar agora, deve ser algum problema com escopo da variável,

vai usando o Alert para o valor da variável em cada ponto, até ver onde ele muda o valor

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow eder eu teste de uma forma que não tinha como erra, ao inves de colocar a variavel idUltimoPaciente eu sabia qual seria esse id entao coloquei manual mesmo, e mesmo assim não inseriu, teria algum codigo ai de um muitos pra muitos, esse relacionamento nao ta indo.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

revendo o seu código, deixa eu confirmar se foi isso,

 

você esta inserindo um paciente:

 

remote.inserirPacientes.send();

 

depois você faz um FOR para inserir os convênios desse paciente

 

var pasciVO:PacienteVO = new PacienteVO(convenios.dataProvider[i].ConvenioId, idUltimoPaciente, "sim")
remoteConvenioPaciente.inserirConvenioPaciente(pasciVO);

essa variável, "idUltimoPaciente", ela só não esta preenchida depois do ResultEvent

do método de cima? o inserirPacientes??

 

 

acredito que o certo seria você chamar o inserirPacientes, esperar o retorno dele,

para que ele trouxesse o ID que foi usado no banco, ai sim você chama o FOR para inserir cada Convenio

 

seria fazer pode etapas, primeiro manda o objeto principal, depois manda os dependentes dele

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

É a variavel idUltimoPaciente, so assume o valor no ResultEvent do metodo inserePaciente. Mas eu testei colocando um id normal, na raça e não foi ficou la o busyCursor o tempo todo. O problema que não posso ter dois botões de cadastro um pra cadasrtar o paciente e pegar o id e depois pra mandar os convenios....

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

não precisa criar dois botões, dentro do função do ResultEvent do inserePaciente, você já chama a outra para inserir:

 

 

 

 

public function funcao(e:ResultEvent):void{

  idUltimoPaciente = uint(e.result);
//o FOR vai aqui
   var pasciVO:PacienteVO = new PacienteVO(convenios.dataProvider[i].ConvenioId, idUltimoPaciente, "sim")
   remoteConvenioPaciente.inserirConvenioPaciente(pasciVO);

}

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz como voce falou Eder, coloquei na funcao que traz o resultEvent.

 

public function ultimoPaciente(e:ResultEvent):void{
		
				idUltimoPaciente = uint(e.result);
				var total:uint = convenios.dataProvider.length;
				for(var i:uint = 0;i<total;i++){
					if(convenios.dataProvider[i].ativo == true){
							
                                                      //Alert.show('Convenios ' + convenios.dataProvider[i].ConvenioId);
							//Alert.show('PacienteId ' + idUltimoPaciente);
							remoteConvenioPaciente.inserirConvenioPaciente(
							 convenios.dataProvider[i].ConvenioId,
							 idUltimoPaciente,
							"pg"
							); 
					
					} 
				}
				limparCampos();
				remote.listarPacientes.send();
				
				
				
			
			}

Só que não insere, fica la o busyCursor o tempo todo na aplicação, e não insere, mesmo dessa vez o id ta vindo certinho. Alguma ideia do que possa ser.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

tem duas coisas que você pode testar ai,

 

deixa a função ultimoPaciente sem nada

 

public function ultimoPaciente(e:ResultEvent):void{
   idUltimoPaciente = uint(e.result);                               
}

o busyCursor some?, pois ele deve ter aparecido antes né, ao chamar o incluirPaciente

 

 

se ele some, então o problema é no proximo passo, faz um teste e tenta adicionar só um convenio

apenas chame:

 

public function ultimoPaciente(e:ResultEvent):void{
   idUltimoPaciente = uint(e.result);  
   remoteConvenioPaciente.inserirConvenioPaciente(convenios.dataProvider[0].ConvenioId,idUltimoPaciente,"pg";                              
}

 

se ele sumir, você já sabe que o problema é chamar varias vezes a mesma função, para o mesmo

objeto remote, ai você teria que ir criando instancias dele dentro do FOR

 

 

testa ai para ver

 

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ow eder resolvi, eu direcionei todo o loop pro php, porque tipo como eu tava fazendo, eu tava pegando um cara e mandando pro php, dai eu voltava pro flex e de novo mandava pro php, dai joguei tudo num vetor e mandei pro php, fiz um for each la e pimba funcionou perfeitamente.

 

Vlw mesmo Eder pelas dicas com ItemRender.

Abs

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.