[RESOLVIDO]atualizar form a partir de um datatable dentro de dialog

bem pessoal, eu possuo um dialog onde nele contem um formulario de cadastro e ainda dentro do formulario so que na parte de baixo possuo um dialog, cadastrar está funcionando tranquilamente, porem eu queria que ao clicar no objeto do datatable ele mostrasse nos campos do formulario o que eu inseri naquele objeto, que vai servir no caso para que eu possa alterar.

segue anexo o codigo da pagina e do bean.

Pagina:

<p:dialog id="MyDialog" resizable="false" widgetVar="dialog" modal="true" appendToBody="true" header="Informações do Orgão" 
		dynamic="true" draggable="false" > 
			<p:ajax event="close" update="MyDialog"/>

			<h:form id="addOrgao">
					<p:growl id="notify" showDetail="true" sticky="true"/>	
					<h:inputHidden value="#{orgaoBean.orgao.codigo}" />
<!-- 				<fieldset><legend>Informações do Orgão</legend> -->
					<h:panelGrid columns="1">
						<h:outputLabel value="*Nome:"/>
						<h:inputText value="#{orgaoBean.orgao.nome}" size="100" required="true" requiredMessage="Nome Obrigatorio"
						validatorMessage="Nome deve conter no minimo '10' caracteres."> 
							<f:validateLength minimum="10" />
						</h:inputText>
					</h:panelGrid>
					
					<h:panelGrid columns="4">
						<h:panelGrid columns="1">
							<h:outputLabel value="Tipo do Orgão:"/>
							<h:selectOneMenu id="tipoOrgao" value="#{orgaoBean.orgao.tipo}" converter="tipoOrgaoConverter" style="width: 140px;" >
								<f:selectItem itemLabel="Selecione" />
								<f:selectItems var="tipoOrgao" value="#{orgaoBean.listarTipoOrgao}" itemLabel="#{tipoOrgao.descricao}" itemValue="#{tipoOrgao}" />							
							</h:selectOneMenu>
						</h:panelGrid>
												
						<h:panelGrid columns="1">
							<h:outputLabel value="*CNPJ:"/>
							<p:inputMask id="cnpj" value="#{orgaoBean.orgao.cnpj}" mask="99.999.999/9999-99" size="25" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="*Codigo Sagres:"/>
							<p:inputText value="#{orgaoBean.orgao.codigoSagres}" size="25" />
						</h:panelGrid>
						
				
						<h:panelGrid columns="1">
							<h:outputLabel value="Decreto:"/>
							<p:inputText value="#{orgaoBean.orgao.decreto}" cols="40" rows="5" />
						</h:panelGrid>	
					</h:panelGrid>
					
					
<!-- 					A partir daqui é o endereço		-->
					
					<h:panelGrid columns="3">
						<h:panelGrid columns="1">
							<h:outputLabel value="*Endereço:"/>
							<p:inputText value="#{orgaoBean.orgao.endereco.logradouro}" size="50" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="*Bairro:"/>
							<p:inputText value="#{orgaoBean.orgao.endereco.bairro}" size="30" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="*Numero:"/>
							<p:inputText value="#{orgaoBean.orgao.endereco.numero}" size="5" />
						</h:panelGrid>
				
					</h:panelGrid>
					
					<h:panelGrid columns="4">
					
						<h:panelGrid columns="1">
							<h:outputLabel value="Complemento:"/>
							<p:inputText value="#{orgaoBean.orgao.endereco.complemento}" size="30" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="*CEP:"/>
							<p:inputText value="#{orgaoBean.orgao.endereco.cep}" size="30" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="*UF:"/>
							<h:selectOneMenu value="#{orgaoBean.orgao.endereco.cidade.estado}" converter="estadoConverter">
								<f:selectItems value="#{orgaoBean.selecionarEstado}" />
								<p:ajax update="cidade" listener="#{orgaoBean.carregarCidades}" />
							</h:selectOneMenu>
						</h:panelGrid>
					
						<h:panelGrid columns="1">
							<h:outputLabel value="*Cidade:"/>
							<h:selectOneMenu id="cidade" value="#{orgaoBean.orgao.endereco.cidade}" converter="cidadeConverter">
								<f:selectItem itemLabel="Selecione a cidade"/>
								<f:selectItems value="#{orgaoBean.selecionarCidade}" var="cidade" itemLabel="#{cidade.nome}" itemValue="#{cidade}" />														
							</h:selectOneMenu>
						</h:panelGrid>
						
					</h:panelGrid>					
<!-- 					Aqui se encontra o Contato -->

					<h:panelGrid columns="3">
						<h:panelGrid columns="1">
							<h:outputLabel value="*Telefone:"/>
							<p:inputText value="#{orgaoBean.orgao.contato.telefone}" size="20" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="Fax:"/>
							<p:inputText value="#{orgaoBean.orgao.contato.fax}" size="20" />
						</h:panelGrid>
						
						<h:panelGrid columns="1">
							<h:outputLabel value="E-Mail:"/>
							<p:inputText value="#{orgaoBean.orgao.contato.email}" size="40" />
						</h:panelGrid>
						
					</h:panelGrid>	
					
					<p:dataTable id="listaOrgao" rows="7" style="margin-top: 10px;" value="#{orgaoBean.lista}" var="orgao"
					 emptyMessage="Não possui Orgãos" selection="#{orgaoBean.orgao}" selectionMode="single" rowKey="#{orgao}">
						<f:facet name="header">Orgãos Cadastrados</f:facet>
						
						<p:ajax event="rowSelect" listener="#{orgaoBean.onRowSelect}" update=":addOrgao" immediate="true" />
						
						<p:column headerText="Orgãos">
							#{orgao.nome}
						</p:column>
						
					</p:dataTable>
					
					<p:separator/>
					
					<p:commandButton value="Salvar" action="#{orgaoBean.salvar}" update="listaOrgao notify" />
					<p:commandButton type="reset" value="Limpar" />
									
<!-- 				</fieldset> -->
			</h:form>
			
		</p:dialog>

Bean:


package br.com.idea.dilicita.beans;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.model.SelectItem;

import org.primefaces.event.SelectEvent;

import br.com.idea.dilicita.exception.DilicitaException;
import br.com.idea.dilicita.facade.DilicitaFacade;
import br.com.idea.dilicita.model.Cidade;
import br.com.idea.dilicita.model.Estado;
import br.com.idea.dilicita.model.Orgao;
import br.com.idea.dilicita.model.TipoOrgao;

@ManagedBean(name="orgaoBean")
@ViewScoped
public class OrgaoBean implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Orgao orgao = new Orgao();
	private Estado estado = new Estado();
	private List<Orgao> lista;
	private List<TipoOrgao> listarTipoOrgao = null;
	private List<Estado> selecionarEstado;
	private List<Cidade> selecionarCidade;
	
	public void salvar() {
		try {
			DilicitaFacade orgaoRN = new DilicitaFacade();
			orgaoRN.salvarOrgao(orgao);
		} catch (DilicitaException e) {
			e.printStackTrace();
		}
	}
	
	public void excluir() {
		try {
			DilicitaFacade orgaoRN = new DilicitaFacade();
			orgaoRN.excluirOrgao(orgao);
			this.lista = null;
		} catch (DilicitaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	public List<Orgao> getLista() {
		try {
			DilicitaFacade orgaoRN = new DilicitaFacade();
			this.lista = orgaoRN.listarOrgaos();
		} catch (DilicitaException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return lista;
	}

	public Orgao getOrgao() {
		return orgao;
	}

	public void setOrgao(Orgao orgao) {
		this.orgao = orgao;
	}

	public List<TipoOrgao> getListarTipoOrgao() {
		if(listarTipoOrgao == null) {
			try {
				DilicitaFacade orgaoRN = new DilicitaFacade();
				this.listarTipoOrgao = orgaoRN.listarTiposOrgaos();
			} catch (DilicitaException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return listarTipoOrgao;
	}
	
	 public List<SelectItem> getSelecionarEstado() {
		 	DilicitaFacade orgaoRN = new DilicitaFacade();
	        List<SelectItem> itens = new ArrayList<SelectItem>();
	        itens.add(new SelectItem(null, "Selecione o estado"));
	        try {
				for (Estado est : orgaoRN.listarEstados()) {
					SelectItem se = new SelectItem();
					se.setValue(est);
					se.setLabel(est.getUF());
				    itens.add(se);
				}
			} catch (DilicitaException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	        return itens;
	    }

	    public List<Cidade> getSelecionarCidade() {
	        return this.selecionarCidade;
	    }
	    
	    public void carregarCidades() {
	    	DilicitaFacade orgaoRN = new DilicitaFacade();
	    	Long n = this.orgao.getEndereco().getCidade().getEstado().getCodigo();
	    	int idEstado = Integer.valueOf(n.toString());
	    	try {	    		
	    		this.selecionarCidade = orgaoRN.listarCidades(idEstado);
	    	} catch (DilicitaException e) {
	    		// TODO Auto-generated catch block
	    		e.printStackTrace();
	    	}      
	    }
	    
	    public void onRowSelect(SelectEvent event) { 
	    	this.orgao = (Orgao) event.getObject();  
	    }

		public Estado getEstado() {
			return estado;
		}

		public void setEstado(Estado estado) {
			this.estado = estado;
		}

}

O que acontece quando você clica em uma linha ?

Uma pergunta.
Quando você adiciona um registro ele automaticamente já o coloca na listagem do datatable ?

quando eu clico em uma linha ele chama o listener que passa um evento, o orgao vai receber o event.getObject(); porem o event está vindo null.

e respondendo a sua pergunta, sim ele ja adiciona automaticamente na listagem do datatable sem fechar o dialog.

Obrigado pela resposta, é que outra pessoa queria esse comportamento, porém a lista não estava sendo atualizada com o novo registro automaticamente.

Não precisa de um converter não para passar o orgão ?

datatable com converter?

Tenta ao invés de passar para o this.orgao passar para o setOrgao

mais isso não vem a interferir, até pq quem ta vindo null é o event ;/

Qual a versão do primefaces ?

Aqui nesse tópico alguém teve o mesmo problema que você

Pelo que vi você poderia usar um link e usar setPropertyActionListener para realizar essa tarefa.
além disso no cabeçalho do datatable já tem o rowSelectListener e o onRowSelectUpdate para dizer qual o atributo a ser atualizado.

porem to olhando aqui e nao existe esse rowSelectListener, axo que é pq eh uma versao mais nova.

Bem, consegui resolver, o problema é que de acordo com a regra de negocio sua rowKey pode ser tanto o rowKey="#{orgao}" e rowKey="#{orgao.codigo}" porque é a forma que ele utiliza para encontrar o objeto.

meu codigo está identico, só mudei o datatable que se encontra assim:

<p:dataTable id="listaOrgao" rows="7" style="margin-top: 10px;" value="#{orgaoBean.lista}" var="orgao"  
                     emptyMessage="Não possui Orgãos" selection="#{orgaoBean.orgao}" selectionMode="single" rowKey="#{orgao.codigo}">  
                        <f:facet name="header">Orgãos Cadastrados</f:facet>  
                          
                        <p:ajax event="rowSelect" update=":addOrgao" />  
                          
                        <p:column headerText="Orgãos">  
                            #{orgao.nome}  
                        </p:column>  
                          
                    </p:dataTable> 

como pode ser visto, nao estou mais utilizando o listener no p:ajax, estou somente atualizando o formulario onde eu quero que apareça.

Daí você retirou a função onRowSelect então ?

Ele após selecionar já preenche o form com os dados do clicado ?

correto, removi o listener…

pq esse ajax rowSelect ele faz o seguinte, ele já atualiza o selection que no caso é #{orgaoBean.orgao} dinamicamente, só que para os campos serem preenchidos eu preciso atualizar o form dos campos, e isso eu faço com o update=":addOrgao"