Bonjour,

J'essaye d'afficher un tableau (tag dataTable) où chaque ligne correspond à un enregistrement. Chaque ligne devrait comporter un bouton permettant de consulter le détail d'un enregistrement. Et c'est là que ça coince.

J'utilise <h:commandButton /> pour créer ce bouton. Le paramêtre value me permet d'aller vers la page de détails. Il faut également transmettre à l'application le numéro de la ligne. Pour celà, le paramêtre actionListener permet d'appeler une méthode selectEnregistrement(ActionEvent). Dans celle-ci, je vérifie l'id du bouton ayant déclenché l'action, ce qui permettrait de savoir quelle ligne a été cliquée. Plus qu'à s'assurer que l'id du bouton indique la ligne en utilisant son paramêtre id.

Voici le code :
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
<h:dataTable value="#{form.listeEnregistrements}" var="enregistrement" border="1">
    <h:column>
        <h:outputText value="#{enregistrement.id}" />
    </h:column>
    <%-- diverses colonnes supprimées ici --%>
    <h:column>
        <h:commandButton
            id="#{enregistrement.id}"
            value="Editer"
            actionListener="#{form.selectEnregistrement}"
            action="editEnregistrement"
            immediate="true"
        />
    </h:column>
</h:dataTable>
Tout à donc l'air d'aller bien, sauf que j'obtiens ceci:
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
Etat HTTP 500 - 

type Rapport d'exception
message 
description Le serveur a rencontré une erreur interne () qui l'a empêché de satisfaire la requête.
exception 
javax.servlet.ServletException: Exception in JSP: /usersList.jsp:43

40:                         <f:facet name="header">
41:                             <h:outputText value="#{text.usersList_actions}" />
42:                         </f:facet>
43:                     <h:commandButton
44:                         id="#{enregistrement.id}"
45:                         value="Editer"
46:                         actionListener="#{form.selectEnregistrement}"
Pas vraiment ce que je voulais.

En remplaçant le paramêtre id (id="#{enregistrement.id}") par une valeur fixe, la page s'affiche correctement, mais bien sûr je perds alors la possibilité pour selectEnregistrement d'identifier la ligne choisie.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
<h:outputText value="#{enregistrement.id}" />
fonctionne normalement.
Remplacer #{enregistrement.id} par #{enregistrement.getId} ne fonctionne pas.

Est-il impossible de calculer l'id d'un composant dynamiquement? Connaissez vous un autre moyen d'accéder au détail d'une ligne d'un tableau dataTable?

Merci d'avance.