IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JSF Java Discussion :

Pb selectOneMenu dans dataTable


Sujet :

JSF Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut Pb selectOneMenu dans dataTable
    Bonjour,

    Je développe depuis peu une nouvelle application avec JSF 1.2 et richFaces 3.3.0GA.

    En suivant la 3ème méthode de la FAQ, j'arrive bien à MAJ chacune de mes lignes en utilisant un setPropertyActionListener.
    Par contre, je me trouve devant une impasse lorsque j'utilise un selectOneMenu dans une de mes colonnes.
    En effet, seule la dernière ligne de ma table prends en compte la nouvelle valeur alors que les autres gardent l'ancienne lors de la MAJ.

    Existe-t-il une bonne pratique que je n'ai pas mise en œuvre ?
    Es-ce un problème connu ? Quels solutions adopter ?

    Ma page xhtml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <rich:dataTable id="tableMessage" cellpadding="0" cellspacing="0" 
                        width="700" border="0" var="mess" value="#{messageBean.messages}"
                        rowClasses="fondBlanc,fondCouleur">
     
    	    			<f:facet name="header">
                            <rich:columnGroup styleClass="fondCouleur">
                                <rich:column breakBefore="true"><h:outputText value="Message" /></rich:column>
                                <rich:column width="1%"><h:outputText value="Cible" /></rich:column>
                                <rich:column width="1%"><rich:spacer width="17" height="10"/></rich:column>
                            </rich:columnGroup>
                        </f:facet>
     
    	    			<rich:column colspan="1">
    	    				<h:inputText styleClass="sansBord" value="#{mess.corpsMessage}"/>
    	    			</rich:column>
     
    	    			<rich:column colspan="1">
    	    				<h:selectOneMenu id="selectTypeId" styleClass="sansBord" value="#{mess.typeUtilisateur.idTypeUtilisateur}" >
    	    					<f:selectItems value="#{messageBean.tousLesTypesUtilisateurs}"/>
    	    				</h:selectOneMenu>
    	    			</rich:column>
     
    	    			<rich:column colspan="1">
    	    				<h:commandLink action="#{messageBean.processSauvMessage}" >
    	    					<h:graphicImage value="../images/valider.jpg" width="17" height="17" title="Valider les modifications" />
    	    						<f:setPropertyActionListener value="#{mess}" target="#{messageBean.messToSave}" />
    	    				</h:commandLink>
    	    			</rich:column>
     
    	    		</rich:dataTable>
    Mon BackingBean:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    public class MessageBBean {
     
    	private List<Message> messages;
    	private List<SelectItem> tousLesTypesUtilisateurs;
    	private Message messToSave;
     
    	public MessageBBean() {
    	}
     
    	public List<Message> getMessages() {
    		return messages;
    	}
     
    	public void setMessages(List<Message> messages) {
    		this.messages = messages;
    	}
     
    	public List<SelectItem> getTousLesTypesUtilisateurs() {
    		return tousLesTypesUtilisateurs;
    	}
     
    	public void setTousLesTypesUtilisateurs(
    			List<SelectItem> tousLesTypesUtilisateurs) {
    		this.tousLesTypesUtilisateurs = tousLesTypesUtilisateurs;
    	}
     
    	public Message getMessToSave() {
    		return messToSave;
    	}
     
    	public void setMessToSave(Message messToSave) {
    		this.messToSave = messToSave;
    	}
     
    	public String initMessages(){
    		try {
    			List<TypeUtilisateur> l = MessageDelegate.getAllTypeUtilisateurs();
    			this.tousLesTypesUtilisateurs = new ArrayList<SelectItem>();
    			for(TypeUtilisateur t : l){
    				this.tousLesTypesUtilisateurs.add(new SelectItem(t.getIdTypeUtilisateur(),t.getLibelleTypeUtilisateur()));
    			}
    			this.messages = MessageDelegate.getAllMessages();
    		} catch (Exception e) {
    			e.printStackTrace();
    			return "retourAccueil";
    		}
    		return "h1MessageGestion";
    	}
     
    	public void processSauvMessage(){
     
    		this.messToSave = MessageDelegate.updateMessage(this.messToSave);		
    		String rien = initMessages();
    		FacesContext.getCurrentInstance().renderResponse();
    	}

  2. #2
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    tu fais où la MAJ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Bonjour et merci de ton intérêt,

    Je fais la MAJ via un commandLink sur chaque ligne. J'utilise un "setPropertyActionListener" pour passer l'objet sélectionne comme dans la méthode 3 de la FAQ. Le tout pointe vers la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    public void processSauvMessage(){
     
    		this.messToSave = MessageDelegate.updateMessage(this.messToSave);		
    		String rien = initMessages();
    		FacesContext.getCurrentInstance().renderResponse();
    	}
    J'attaque mes EJB3 via une classe MessageDelegate à qui je délègue tous les appels JNDI (je suis sur jboss 4.x qui ne supporte pas l'injection @EJB).

    Je précise que mon entity Message comprend un objet TypeUtilisateur et que c'est justement celui là qui n'est pas mis à jour. Le problème étant que "messToSave" ne contient pas la valeur modifiée par le "selectOneMenu" lorsque je le reçoit dans ma fonction de MAJ.

    Merci d'avance...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Personne n'aurait une idée ?
    Quelque chose que j'aurais mal fait ou que je n'aurais pas fait ?

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    Juin 2003
    Messages
    4 184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 184
    Par défaut
    Citation Envoyé par wushual1 Voir le message
    Personne n'aurait une idée ?
    Quelque chose que j'aurais mal fait ou que je n'aurais pas fait ?
    Je ne comprend pas ton problème..

    la valeur du selectOneMenu correspond à chaque ligne du bean, pour faire l'update tu récupère une ligne..
    cette valeur ne correspond pas à ce que tu as saisi?

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 34
    Par défaut
    Exactement !!

    En fait, lorsque je récupère ma ligne et que je regarde la valeur correspondant à ce que doit modifier mon selectOneMenu (en l'occurrence un objet TypeUtilisateur), j'ai l'ancienne valeur.

    De plus, je me suis aperçu que seule la dernière ligne de mon tableau récupère la valeur modifiée (celle que je veux effectivement sauvegarder)...

    Ajout:

    En fait dans chaque ligne de mon tableau, j'ai un objet message:
    Long id
    String corpsMessage
    TypeUtilisateur type
    Date dateFinVal

    Dans la colonne correspondant au type, j'utilise un selectOneMenu qui est une List<SelectItem> remplie avec (idType.toString(), libType).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 02/02/2012, 22h14
  2. SelectOneMenu dans un dataTable
    Par amarmama dans le forum JSF
    Réponses: 4
    Dernier message: 25/04/2008, 19h41
  3. Réponses: 3
    Dernier message: 29/12/2006, 16h11
  4. panelTab dans dataTable
    Par Alec6 dans le forum JSF
    Réponses: 4
    Dernier message: 30/11/2006, 18h59
  5. Réponses: 2
    Dernier message: 07/07/2005, 11h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo